据我所知,GC仅在JVM需要更多内存时使用,但我不确定。所以,请有人建议回答这个问题。
答案 0 :(得分:8)
Java的垃圾收集算法就像我所理解的那样,非常复杂而且不那么简单。此外,还有多种可用于GC的算法,可以在VM启动时选择并将参数传递给JVM。
这里有关于垃圾收集的常见问题解答:http://www.oracle.com/technetwork/java/faq-140837.html
Oracle还发表了一篇文章“使用5.0 Java [tm]虚拟机调优垃圾收集”,其中包含对垃圾收集的深入见解,可能会帮助您更好地理解这个问题:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
答案 1 :(得分:2)
JVM和Java规范没有说明何时发生垃圾收集,因此完全取决于JVM实现者他们希望使用哪些策略。每个JVM都应该有一些关于它如何处理GC的文档。
通常,大多数JVM会在内存分配将分配的内存总量推高到某个阈值以上时触发GC。可能存在多个不同阈值的gc(完全与部分/世代)水平。
答案 2 :(得分:1)
垃圾收集在Java语言规范中有意模糊地描述,为JVM实现者提供了最好的工作条件,以提供良好的垃圾收集器。
因此,垃圾收集器及其行为非常依赖于供应商。
最简单但最不有趣的是在需要清理时停止整个程序的那个。其他人则更加成熟,并且随着你的程序或多或少地进行清理,你可以安静地运行。
调查垃圾收集最有趣的方法是在Sun 6 JDK中运行jvisualvm。它允许您查看许多与垃圾收集相关的内部事物。
答案 3 :(得分:0)
在过去的日子里,垃圾收集器本质上是经验性的。在某个设定的时间间隔或基于某些条件,他们会开始并检查每个物体。
现代的收藏家更聪明,因为他们根据对象的不同生命周期来区分。对象在年轻代对象和终生代对象之间进行区分。
内存根据生成在池中进行管理。每当年轻代内存池被填满时,就会发生次要收集。幸存的对象被移动到终身代内存池。当终身代内存池被填满时,会发生一个主要的收集。保留第三代,称为永久生成,可能包含定义类和方法的对象。