Stack 和Heap的差别,上次华为研究生笔试题就考过。C语言的我很清楚:
Stack: automatic variables within functions
Heap: global variables (storage class external), and static variables
简而言之,最大的不同是:前者是函数变量的空间,后者是程序变量的空间
另外,Stack上分配内存是安全的。而Heap上分配内存则没那么爽了。调用malloc分配内存,是在Heap上开辟空间。一定要注意释放。否则老是memory leak
昨天有人问我JVM中的Stack和Heap的差别,当时心不在焉地照搬C语言敷衍了事。
中午起床,没事闲着看帖子。无意中想起这个问题,在Google搜索了一番。发现昨天的回答出了问题:
“ It is useful to know that these two different kinds of memory exist in Java. Stack memory is the program's memory, and heap memory resides outside of the program.”
Stack是程序内存,Heap内存存在于程序之外。这样子看起来和C语言中地Heap有些像诶(C语言中的Heap也是在mian()之外的)。再仔细看看
Stack memory stores primitive types and the addresses of objects. The object values are stored in heap memory.
类实例存在于Heap。类实例的的指针在Stack中存放。难怪JVM没有text segment ,在Stack就囊括了text segment。
这样做的好处,就是为了实现Java的垃圾回收机制。任何的类对象实例都在Heap中,在Stack中有它们的引用。当所以的线程都不在需要某个引用时,JVM的那个资源回收线程就会把该实例从Heap当中清楚掉。
文章告诉我,回收线程要做全局的检测来确定某个实例是否已经“无用”了。这样子,我们可以在代码上做些工作,来给回收线程加速。
Test t = new Test();
t.someAction();
// all done
t = null;
实例t不再有用时,就把他置为null,告诉JVM:你不用在Stack和Heap之间自己校验啦,我已经做好了标记,放心回收吧。
小结:Stack: Primitive data types(primitive types), the addresses of objects(=references).
Heap: objects.
前者:基本类型和实例地址(引用),后者:类实例
posted on 2006-07-31 16:28
murainwood 阅读(737)
评论(2) 编辑 收藏 所属分类:
Java读书笔记