gc只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().这段话好像给出了“堆”和“栈”的区别,new出来的是“堆”内存,而C中malloc分配的内存就是“栈”? 同样是内存分配,为何会产生两个结果?“堆”和“栈"可以看出同为内存中的一段区域,二者到底有何不同?
前者小但是被访问频繁而且速度快后者比较大但是访问速度慢,他们影响着CPU的计算性能(赛扬和奔腾唯一不同的就是二级缓存,价格差距巨大:) )。
栈使用的是一级缓存,JAVA中的方法调用和基本变量都是运行时存在这个区域中, 他们通常都是被调用时处于存储空间中,调用完毕立即释放, 而堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。所以JAVA通过使用一些优化方式来优化调用,比如final等。“堆栈”是数据结构的一种,用于表示后进先出(LIFO)型数据。
哪本书上讲的此时分配的内存会分配在栈上?
C程序malloc其实分配的内存也在堆上,而C语言的堆是由程序员自己来管理,free()。
估计此处为区分java中由GC管理的堆和C语言中由程序员管理的堆,所以
java的GC其实是由一线程计算各对象的引用,如果没有有效的引用时,则收集此对象的内存。
栈是用指针的吧,堆的大小好像是运行期动态变化的。gc好像主要是针对heap的吧
不知道我说的对不对,高手指点一下
FAQ 似乎还是有些难以被命中。