黑马程序员技术交流社区

标题: 栈、堆、方法区 [打印本页]

作者: 黑马-邢广耀    时间: 2012-12-27 01:17
标题: 栈、堆、方法区
栈内存、堆内存和方法区中都存储什么?麻烦给总结一下,我有点乱了,谢谢
作者: 李海鹏    时间: 2012-12-27 08:03
那些东西是很重要,但是学习要循序渐进,你先记住有这么个东西,学好基础再去研究这些东西。
那些都是虚拟机规范中的内容,它们针对的对象不是java程序员,而是虚拟机设计者,你现在虚拟机规范还不知道以及这些东西的概念也不清楚就研究他们实在是不合适。
sun的官方有虚拟机规范文档下载,你可以去下载来看看,还有你所问的那些堆与栈的存放方式以及静态区与对象池如何实现等等,每个虚拟机都是不同的,规范文档并没有指明,而且虚拟机的内存实现是需要适应不同平台与机器的,例如在嵌入式设备中,内存限制很大,所以内存设计上会注重节约内存来牺牲运行速度,所以实现会把堆、栈以及对象池等等都放在同一段内存中,这样设计为了提高速度,又不得不使用类的静态连接而不用动态连接等等。如果在服务器中,jdk的内存很充裕,那么可以把各个内存存放都分开,都建立一套自己的存储空间以及存储方式,而且还可以多加一些附加内存来加快访问速度。对于平台限制也很大,不同平台对于内存的处理以及分配方式都不同,例如有的平台是低位在前的,有的平台又有可能是高位在前的,有的平台是多线程机制的,而有的平台是没有线程概念的多进程机制的等等。
由于java需要跨平台,所以虚拟机规范并没有规定楼主所提的那些东西要如何去实现,只是规定需要实现这些东西,所以你问他们是否单独存放以及存放在哪都是不合适的。如果你想研究他们的内存机制如何实现只能拿一个特列来研究,而这个特例也绝对不具有代表性。不过我推荐楼主还是去研究sun的官方的j2se的jdk吧,至少有这么个特例看似标准,但是那对你的实际用途并不大,因为当你把应用迁移到weblogic或者IBM的一些产品上面时会发现你研究的那一套内存方式完全没用了,因为那些JDK实现与SUN官方的实现截然不同了。
而且java语言设计的初衷就是要规避java对内存的访问,把代码开发保护在一个安全的机制下(当然,完全逃避内存问题是不可能的),所以你只要知道如何做能够节约内存,学好普通的数据结构差不多够用了,至于虚拟机的内存机制如何,对实际用途不大。
作者: netboy032    时间: 2012-12-27 08:51
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放;

堆内存:
          a.数组和对象,通过new建立的实例都存放在堆内存中
          b.每一个实体都有内存地址值
          c.实体中的变量都有默认初始化值
          d.实体不再被使用,会在不确定的时间内被垃圾回收机制回收
方法区中是存放静态成员的的。
作者: cyh8807    时间: 2012-12-27 08:51
code segement 中存放代码
data segement 中存放 静态变量,字符串常量
栈内存 stack 中存放 局部变量
堆内存 heap 中存放  new出来的东西
通常情况下申请的 变量都是存放在栈内存中




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2