日期:2014-05-20  浏览次数:20730 次

java 栈内存,堆内存,方法区,常量池,静态去到底有什么关联, 方法区,常量池,静态区又存在哪里啊,栈中,还是另外的一块空间?
被这几个搞糊涂了?

请高手明示, 我应该看哪些东西才能弄明白这些

------解决方案--------------------
java虚拟机
------解决方案--------------------
现在流行"授人以渔"了哦,给你个连接哦http://www.ibm.com/developerworks/cn/java/coretech/java-vm.html?S_TACT=105AGX52&S_CMP=content
自己加油哦

------解决方案--------------------
简单的说,栈可以共享,堆不可以。
所以,那些方法,常量,静态都在栈里。
------解决方案--------------------
首先要想了解这些东西,需要有些汇编语言的知识。

因为编写过汇编语言的人都知道,这些东西都要手动去编写(即:手动的编写代码段,栈段,当然了堆里的东西是动态分配的)。

《深入Java虚拟机》(第二版)很不错。
------解决方案--------------------
王爽的8086汇编写的很不错吼~~
------解决方案--------------------
从理伦上讲这几个区域是独立的,我只知道 stack(栈) 里面放变量还有引用, datasigment(数据区) 放 字符串和常量,还有static变量 , heap(堆)里面放对象还有数组等等,
codesigment(代码区)就放其它的一些代码,我只能解释这么多,我也没有深究,楼主建议你去看一看马士兵的视频在第三章里面讲的很清楚的
------解决方案--------------------
这些实现并非在java虚拟机实现规范之内,java虚拟机规范只是定义了这些名词与虚拟机参照实现思想,但是至于这些内存要如何去分配是虚拟机设计者自己去考虑的问题,他们可以分为不同内存去存放,也可以同一块内存来存放,虚拟机规范只规定你要实现怎样的功能,并没有规定你要如何去实现。
如果你想搞清楚这些东西的作用,虚拟机规范文档里面有,但是这些只可以说是一种设计参照,具体要看jdk设计者如何去设计了。
虚拟机的规范文档可以在sun官方网站下到。
------解决方案--------------------
那些东西是很重要,但是学习要循序渐进,你先记住有这么个东西,学好基础再去研究这些东西。
那些都是虚拟机规范中的内容,它们针对的对象不是java程序员,而是虚拟机设计者,你现在虚拟机规范还不知道以及这些东西的概念也不清楚就研究他们实在是不合适。
sun的官方有虚拟机规范文档下载,你可以去下载来看看,还有你所问的那些堆与栈的存放方式以及静态区与对象池如何实现等等,每个虚拟机都是不同的,规范文档并没有指明,而且虚拟机的内存实现是需要适应不同平台与机器的,例如在嵌入式设备中,内存限制很大,所以内存设计上会注重节约内存来牺牲运行速度,所以实现会把堆、栈以及对象池等等都放在同一段内存中,这样设计为了提高速度,又不得不使用类的静态连接而不用动态连接等等。如果在服务器中,jdk的内存很充裕,那么可以把各个内存存放都分开,都建立一套自己的存储空间以及存储方式,而且还可以多加一些附加内存来加快访问速度。对于平台限制也很大,不同平台对于内存的处理以及分配方式都不同,例如有的平台是低位在前的,有的平台又有可能是高位在前的,有的平台是多线程机制的,而有的平台是没有线程概念的多进程机制的等等。
由于java需要跨平台,所以虚拟机规范并没有规定楼主所提的那些东西要如何去实现,只是规定需要实现这些东西,所以你问他们是否单独存放以及存放在哪都是不合适的。如果你想研究他们的内存机制如何实现只能拿一个特列来研究,而这个特例也绝对不具有代表性。不过我推荐楼主还是去研究sun的官方的j2se的jdk吧,至少有这么个特例看似标准,但是那对你的实际用途并不大,因为当你把应用迁移到weblogic或者IBM的一些产品上面时会发现你研究的那一套内存方式完全没用了,因为那些JDK实现与SUN官方的实现截然不同了。
而且java语言设计的初衷就是要规避java对内存的访问,吧代码开发保护在一个安全的机制下(当然,完全逃避内存问题是不可能的),所以你只要知道如何做能够节约内存,学好普通的数据结构差不多够用了,至于虚拟机的内存机制如何,对实际用途不大。