Java 垃圾回收的问题,请教

在看thinking in java 时, 看到这样一句话:“java 里的对象并非总是被垃圾回收的”。感觉不好理解,不是有垃圾回收机制吗,这个机制会自动的运行,那为什么要说垃圾对象不一定会被回收?

这个说法就是说java的回收机制是不可靠的,基本就是java感觉到内存不足时才来收垃圾的。如果说你一个小程序,在巨大内存空间运行,有可能当程序结束的时候,垃圾还没被回收。个人感觉在大多数时候还是可以相信垃圾回收机制的,但是你也要尽量优化你的算法,因为垃圾回收的启动本身就是个巨耗内存的玩意,所以你最好也不要手动调用gc方法来强行垃圾回收,那样只会更耗费内存。
java的回收机制有时候会出现当你内存可用空间多的时候反而感觉卡,而内存少的时候反而感觉不卡了,这就是垃圾回收的时候要耗费很大的系统资源,当他启动后可用内存是多了,但是资源还没放开。而可用资源少的时候,就是java认为他现在这点空间已经够他用了,他就不回收了,而且事实上你的程序的确也不需要更多内存,他就不会进行垃圾回收,就没有额外的系统开销,就反而就不卡了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-02-20
简单的说就是在堆中分配的对象(如,类的成员变量),不会被回收;在栈中分配的对象(如,局部变量)就会被回收。
第2个回答  2009-02-20
java的垃圾回收基本等于没有!
必须手动释放内存!
就是这个意思,因为垃圾回收机制不完善!
第3个回答  2009-02-20
好像java有自动回收机制吧
第4个回答  2009-02-20
是的,
java 圾回收是在你的内存被运行程序对象垃圾占用了很多很多,java 圾回收机制才回去运行它的回收程序.因这这个回收程序的运行是很占内存很要时间的.所以一般你的程序还可以运行时它是不会去浪费资源去回收垃圾的.不知你有没有在玩java做的游戏,在你完了很久到,游戏就突然停了一下,或是慢了.这就是java在回收垃圾!
第5个回答  2019-10-01
system.gc();并不保证立刻执行垃圾回收,jvm只会根据当前内存使用情况来决定是否真正执行对象的回收,所以有时候调用了system.gc();后也不一定会把new
webbank(true)出来的对象回收掉,当然也就不会调用finalize方法了,至于bank1和bank2这2个对象在main
thread结束之前是都不会被回收的,因为main
thread保留了他们的引用。
相似回答