gc只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().这段话好像给出了“堆”和“栈”的区别,new出来的是“堆”内存,而C中malloc分配的内存就是“栈”? 同样是内存分配,为何会产生两个结果?“堆”和“栈"可以看出同为内存中的一段区域,二者到底有何不同?
解决方案 »
- java 传值和传引用疑惑
- 关于notify 和notifyAll方法
- java中为什么要有封装类?它的作用是什么?
- java关于四舍五入
- 初学STRUTS2,请问为什么我必须要helloworld.action才能打开页面?谢谢
- List.toArray的一个问题
- 利用JAVA开发windows应用程序(类似CS风格的程序)的可行性论证!
- 关于TOMCAT的配置.
- 怎样编写打开任何类型的文件,然后将该文件读取写到新建的文件里的Java类?
- 我正准备学习JAVA,不知如何。。。。。。。。。。。急!
- Class.forName是干什么的?书上说可以用它来动态加载类,文档好像是说它返回一个Class类
- 怎么把字符串的时间加上1秒,立即结贴。
前者小但是被访问频繁而且速度快后者比较大但是访问速度慢,他们影响着CPU的计算性能(赛扬和奔腾唯一不同的就是二级缓存,价格差距巨大:) )。
栈使用的是一级缓存,JAVA中的方法调用和基本变量都是运行时存在这个区域中, 他们通常都是被调用时处于存储空间中,调用完毕立即释放, 而堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。所以JAVA通过使用一些优化方式来优化调用,比如final等。“堆栈”是数据结构的一种,用于表示后进先出(LIFO)型数据。
哪本书上讲的此时分配的内存会分配在栈上?
C程序malloc其实分配的内存也在堆上,而C语言的堆是由程序员自己来管理,free()。
估计此处为区分java中由GC管理的堆和C语言中由程序员管理的堆,所以
java的GC其实是由一线程计算各对象的引用,如果没有有效的引用时,则收集此对象的内存。
栈是用指针的吧,堆的大小好像是运行期动态变化的。gc好像主要是针对heap的吧
不知道我说的对不对,高手指点一下
FAQ 似乎还是有些难以被命中。