Java 什么触发垃圾收集

Java 什么触发垃圾收集,java,garbage-collection,Java,Garbage Collection,我知道所有的垃圾都被收集了。但究竟是什么告诉JRE现在是垃圾收集的时候了?它像某种事件或时间间隔吗?您可以使用System.gc()但是不能保证它会运行(它只是“建议”GC运行) JVM有不同的实现,包括可以在不同模式下运行的GC,还有非常复杂的算法,这些算法通常工作得很好,也就是说,如果您有特殊用途(或特殊事件,如平台重启后),可以对其进行调优(如:最小堆大小、最大堆大小等),但即使不这样做,只要需要从堆中释放内存,GC也会收集具有null引用的对象(指向它们的指针)。对象具有null引用,那

我知道所有的垃圾都被收集了。但究竟是什么告诉JRE现在是垃圾收集的时候了?它像某种事件或时间间隔吗?

您可以使用
System.gc()但是不能保证它会运行(它只是“建议”GC运行)


JVM有不同的实现,包括可以在不同模式下运行的GC,还有非常复杂的算法,这些算法通常工作得很好,也就是说,如果您有特殊用途(或特殊事件,如平台重启后),可以对其进行调优(如:最小堆大小、最大堆大小等),但即使不这样做,只要需要从堆中释放内存,GC也会收集具有null引用的对象(指向它们的指针)。

对象具有null引用,那么它将被垃圾收集。但是GC并没有像它完成时那样提供保证。

我认为作为一个好的实践并不完全依赖于GC,请参见或HotSpot的垃圾收集已经发展成为一项极其复杂的业务,甚至连它的创建者都很难完全理解它的细节。因此,你不能得到一个简单的答案;一些触发因素包括:

  • 每个对象生成的占用达到阈值
  • 特定生成中的内存分配请求失败
  • 总堆占用率达到阈值
  • 请注意,您甚至还没有指定您感兴趣的垃圾收集类型:有一个次要收集和一个主要收集,在技术上它们是非常不同的。您还没有指定您心目中的垃圾收集器:HotSpot有四个垃圾收集器可供选择


    如果你是Java初学者,最好的建议是:在日常编程中,不要担心;b)如果你想学习,你必须学习。

    JVM控制垃圾收集器,它决定何时运行垃圾收集器。当它意识到内存不足或当没有活动线程可以访问某个对象时该对象符合GC条件时,它将运行GC


    但是JVM的这种行为无法保证,可以从java程序中请求GC,但不能保证JVM会处理此请求。

    当JVM
    认为它需要基于java的垃圾收集时,java中的垃圾收集就会发生

    但是您可以使用强制GC收集垃圾

    System.gc () 
    

    但不能保证垃圾收集会发生


    阅读更多信息:

    肯定有人问过这个问题……是的,你真的不应该使用System.gc。JVM比您更清楚何时执行GC。在某些情况下,调用System.gc是合理的,但大多数情况下开发人员不应该这样做。@pushy完全同意您的观点!第一部分是正确的,Java将在内存不足时执行GC。但是Java不知道对象何时符合GC(这个决定是在GC本身中做出的)。如果使用标记/扫描收集器,它当然会标记死对象并在必要时对其运行扫描,但这是GC的一部分。@pushy:你说得对,我误解了对象何时符合GC条件以及JVM何时运行GC,谢谢你的说明。你不是在“强制”垃圾收集。正如你自己所说:没有保证。我认为“请求”这个词在这里更合适。
    Runtime.gc ()