我知道什么都会被垃圾收集。但是究竟是什么告诉 JRE 现在是垃圾收集的时候了?它像某个事件或时间间隔吗?
6 回答
HotSpot 的垃圾收集已经发展成为一项极其复杂的业务,即使是其创建者也难以完全理解。因此不能给你一个简单的答案;一些触发器是:
- 每个对象代的占用达到阈值;
- 特定代中的内存分配请求失败;
- 整体堆占用达到阈值。
请注意,您甚至没有指定您对哪种垃圾收集感兴趣:有次要收集和主要收集,并且在技术上它们非常不同。您还没有指定您想到的垃圾收集器:HotSpot 有四个可供选择。
如果您是 Java 初学者,最好的建议是 a) 在日常编程中,不要担心;b)如果你想学习,你必须深入挖掘。
您可以使用System.gc();
,但不能保证它会运行(它只是“建议”GC 运行)。
JVM 有不同的实现,包括可以在不同模式下运行的 GC,并且有非常复杂的算法,通常工作得很好,也就是说,如果你有特殊用途(或特殊事件,比如重新启动平台后) - 您可以使用标志来调整它(例如:最小堆大小、最大堆大小等),但即使不这样做,GC 也会在需要释放内存时收集具有空引用的对象(指向它们的指针)堆。
对象有空引用,那么它将被垃圾收集。但是 GC 不会像完成时那样提供保证。
当JVM
认为它需要基于 Java堆大小的垃圾收集时,Java 中的垃圾收集就会发生。
但是你可以强制 GC 收集垃圾使用
System.gc ()
或者
Runtime.gc ()
但不能保证垃圾收集会发生。
阅读更多:http: //javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2Y9gKzQE1
JVM 控制垃圾收集器,它决定何时运行垃圾收集器。当它意识到内存不足或当没有活动线程可以访问对象时,它会运行 GC。
但是不能保证 JVM 的这种行为,可以从 java 程序中请求 GC,但不能保证这个请求会被 JVM 处理。