黑马程序员技术交流社区

标题: 代码运行过程中的内存分配和常量池的问题 [打印本页]

作者: 画了一个圈儿    时间: 2014-8-24 12:14
标题: 代码运行过程中的内存分配和常量池的问题
在CSDN上看了一篇关于内存分配的技术博客 http://blog.csdn.net/shimiso/article/details/8595564。
关于堆和栈总结如下:
       变量分两种:1,局部变量;2,成员变量。
       局部变量:分为普通类型变量和引用类型变量(俗称实例),他们都保存在栈中。普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。
       成员变量:随着类的加载而产生的类的成员变量,只要类存在,它们就一直存在。成员变量与其所属的类都存储在堆内存中。
       注:
       (1)Class a= new Class();  a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。
       (2) 栈中的数据和堆中的数据销毁并不是同步的。方法一旦结束,栈中的局部变量立即销毁,但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才销毁,而且还不是马上销毁,要等垃圾回收扫描时才可以被销毁。
       方法:类的方法是该类的所有对象共享的,只有一套,对象使用方法的时候方法被压入栈,方法不使用则不占用内存。

问题:后来涉及到常量池的问题楼主就彻底凌乱了,毕老师说常量池存在于方法区中,这篇文章说常量池存在堆内存中,求大侠们给个正解!!!
作者: nadax    时间: 2014-8-24 12:40
你要回用汇编 查下内存地址不就知道了 到底属于哪个区。  这些划分内存物理地址就有区分了吧。
作者: bbdeyouxang    时间: 2014-8-24 13:37
深入JAVA虚拟机 里面有讲,老毕是对的,但是这两种说法并不冲突,不要太纠结这个,实在不懂看这个帖子吧,http://yiliner.iteye.com/blog/207723
作者: 画了一个圈儿    时间: 2014-8-24 14:30
bbdeyouxang 发表于 2014-8-24 13:37
深入JAVA虚拟机 里面有讲,老毕是对的,但是这两种说法并不冲突,不要太纠结这个,实在不懂看这个帖子吧,h ...

谢谢大侠解惑




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