关于"Java栈与堆一篇好文!!" http://topic.csdn.net/u/20081123/12/f70f1632-24be-4caa-bc20-29cf8267afab.html这个帖子误导了很多人, 而且关于java中的堆和栈 现在还没有一个全面的说法我看过《深入Java虚拟机》一书, 对这些还是有一点了解, 下面是我的这点认识, 希望能给大家点帮助当然我的认识也有可能是不足甚至错的, 那就权当抛砖引玉的作用把, 把那些高手都引出来:)堆(heap): 在数据结构中, 是一种特殊的二叉树, 而在JVM中的堆却不是这种结构JVM中的堆是伴随着JVM实例的产生而产生的.当我们的java程序运行的时候, 一定会先实例化一个JVM, 一个JVM对应着我们的一个Java程序而一个JVM又会维护着一个堆, 这个堆的结构类似于双向链表, 它在内存中的分布可以是很多不连续的内存地址这个堆是用来放置java中的对象双向链表的性质就是增、删、改数据元素非常的快, 但是查询元素很消耗资源, 所以java在查找对象方面使用了散列码来大大减低查找的难度JVM对于每一个java的线程, 都会分配一个独立的, 私有的Java栈该Java栈中的数据是该线程私有, 其他线程都不可访问, 所谓的线程同步问题, 是针对堆上对象中的数据Java虚拟机是基于栈的机器, 几乎所有的Java虚拟机的指令都与操作数栈有关Java栈以帧为单位保存线程的运行状态. 虚拟机只会直接对Java栈执行两种操作: 以帧为单位的压栈和出栈每当线程调用一个Java方法时, 虚拟机都会在该线程的Java栈中压入一个新帧, 它使用这个帧来存储参数、局部变量、中间运算结果等等数据Java方法有两种方式完成, 一种是return, 正常返回; 一种是通过抛出异常而异常终止的, 不管哪种方式返回, 虚拟机都会把当前帧弹出Java栈然后释放掉,这样上一个方法帧就变成当前帧了每个栈帧又分为三部分: 局部变量区、操作数栈、帧数据区局部变量区包含对应方法的参数和局部变量, 你定义的局部变量都在这里, 都是通过操作数栈放进局部变量区的对象的引用和boolean、byte、char、short、float和int一致, 都在这里占用1个字长(32位), 而double和long占2个字长操作数栈为Java虚拟机的工作区, 所有的操作,包括方法调用, 算法的计算全部都是在操作数区完成的java字节码就是一系列的指令集, 它们都是用来操作这个操作数栈的帧数据区存储一些支持正常方法返回以及异常派发机制等等的数据综合的来说, Java虚拟机是基于栈的机器, 所有的操作都是基于栈的, 调用方法时会进行以栈帧为单位的压栈和出栈操作,而方法内部的操作全部通过源文件编译后的class字节码指令操作栈帧中的操作数栈来完成的(同样也是压栈和出栈)对象则是放在堆里面, 在栈中只会存在它的一个引用成员变量会被存储在一个叫常量池的地方, 这里存放的还有很多东西, 包括本类和父类的信息、方法的字节码等等而方法则可以看成一系列指令的集合, 当你调用方法的时候, 就是向操作数栈发送指令

解决方案 »

  1.   

    额要写的多就更涉及到底层了建议看看《深入Java虚拟机》
    那里面非常的细。。呵呵:)
      

  2.   

    嗯嗯 很不错
    JAVA中很少对堆内存进行操作
    大部分是栈内存去引用堆内存
      

  3.   


    不错,楼主有《深入Java虚拟机》的电子书吗?中文英文的都行,分享一下。
      

  4.   

    http://www.artima.com/insidejvm/ed2/index.html
      

  5.   

    http://download.csdn.net/source/810374我把书上传到我的资源里去了 《深入Java虚拟机第二版》, 有想看的去下吧