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