垃圾收集识别任何变量不再引用的对象,然后回收对象占用的内存。
我不知道此过程是在定期间隔内完成还是在对象引用计数降至零时立即完成。
假设,如果GC在对象引用计数下降到零时立即工作,那么就不需要通过调用System.GC()来请求GC;那么,在这种情况下,此方法的目的是什么?
答案 0 :(得分:4)
GC既不是在常规间隔中完成也不是在对象引用计数降至零时完成(注意:大多数JVM实现不使用引用计数算法,因此最后一点是没有意义的。)
GC运行时由垃圾收集算法确定。
答案 1 :(得分:1)
这是由垃圾收集算法决定的。甚至有System.gc ()
和Runtime.gc ()
这样的方法用于将垃圾收集请求发送到JVM ,但不保证垃圾收集将会发生。
答案 2 :(得分:1)
当您致电System.gc()
时,您要对垃圾收集器进行清理。问题是,GC
何时会回复您的请求并不清楚。更重要的是,当你调用它时,GC
可能根本不运行。 在java中,您无法预测GC
的工作方式。 (这就是为什么将清理代码放在Object
的{{1}}方法中)被认为是不好的做法。在finalize()
中,将自动收集引用对象的垃圾。这就是您不需要致电Java
的原因。在特殊情况下,如果您希望尽可能运行它,您可以尝试使用此方法,但不保证行为。 (如上所述)。
答案 3 :(得分:1)
大多数现代JVM使用“stop-the-world”垃圾收集器,即垃圾收集器,它停止程序中的所有应用程序线程,执行垃圾收集,然后恢复应用程序线程。这意味着在进行垃圾收集之前,应用程序中的所有线程都应该到达可以安全停止线程的点。
答案 4 :(得分:0)
如果某个对象无法从任何活动线程或任何静态引用访问,则该对象符合垃圾收集或GC的条件,换句话说,如果一个对象的所有引用都为空,则可以说该对象符合垃圾回收条件。循环依赖项不计入引用,因此如果对象A具有对象B的引用而对象B具有对象A的引用并且它们没有任何其他实时引用,则对象A和B都将有资格进行垃圾收集。
通常,在以下情况下,对象有资格在Java中进行垃圾收集:
1)该对象的所有引用都明确地设置为null,例如object = null
2)在块内创建对象,并且一旦控制退出该块,引用就会超出范围。
3)父对象设置为null,如果对象保存另一个对象的引用,并且当您将容器对象的引用设置为null时,子对象或包含对象自动符合垃圾回收的条件。
4)如果一个对象只有通过WeakHashMap的实时引用,它将有资格进行垃圾收集。
有一些方法,如System.gc()和Runtime.gc(),用于向垃圾收集发送垃圾收集请求但不保证垃圾收集会发生。
答案 5 :(得分:0)
有两个答案:
垃圾收集器运行时,JVM规范,JLS或任何其他权威Java文档都没有指定它。因此,具体实施。
在实践中,通常使用几种不同的策略。对于非并发收集器,当尝试分配失败时会触发GC,因为没有足够的未分配空间。对于并发收集器,当可用空间量低于预定阈值时启动集合。 (对于HotSpot并发GC,阈值比率是可调参数。)
没有现代Java GC使用引用计数。
System.gc()
的目的是允许应用程序为JVM提供提示“现在是运行垃圾收集器的好时机”。允许JVM忽略该提示。作为一般规则,以这种方式触发GC在CPU使用方面效率低下。在生产代码中执行此操作的唯一合法理由是避免高度交互式应用程序中的GC暂停。 (当您知道不需要交互时,例如在游戏中的“级别”之间,您尝试强制执行GC。)