2010-09-29 73 views
1

据我所知只有当JVM需要更多的内存时才使用GC,但我不确定它。所以,请有人提出这个问题的答案。什么时候在java中使用垃圾回收器?

+6

有许多好文章网上关于GC。尝试搜索一些太阳博客或白皮书。这些对你最有帮助。 – 2010-09-29 17:30:00

回答

8

据我所知,Java的垃圾回收算法非常复杂,并不那么简单。此外,还有更多可用于GC的算法,可以在VM启动时使用传递给JVM的参数进行选择。

有一个关于垃圾收集在这里FAQ:http://www.oracle.com/technetwork/java/faq-140837.html

甲骨文还发表了一篇文章“调整垃圾回收与5.0的Java(TM)虚拟机”,其中包含的深刻见解变成垃圾收集,并可能帮助你理解这件事更好:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

+0

常见问题链接是否有用。 – 2010-09-29 21:55:05

2

JVM和Java规范没有说垃圾收集何时发生,所以它完全取决于JVM实现者他们希望使用哪些策略。每个JVM都应该有一些关于它如何处理GC的文档。

通常情况下,当内存分配将分配的内存总量推到某个阈值以上时,大多数JVM都会触发GC。可能有多个级别的gc(全部与部分/世代)出现在不同的阈值。

0

在过去,垃圾收集器本质上是经验性的。在某个设定的时间间隔或基于某种条件,他们会踢入并检查每个对象。

现代的收藏家更聪明是因为他们根据物体具有不同的寿命这一事实进行区分。这些对象区分年轻一代对象和终身代代对象。

内存按照代次在池中进行管理。每当年轻一代记忆池被填满时,就会发生次要收集。幸存的对象被移动到终身代内存池。当终身代内存池被填满时,发生主要收集。保留第三代,称为永久代,可能包含定义类和方法的对象。

1

垃圾收集是在Java语言规范中故意模糊地描述的,为JVM实现者提供了最佳工作条件来提供好的垃圾收集器。

因此,垃圾收集器及其行为是非常依赖供应商。

最简单但最不有趣的是当需要清洁时停止整个程序。其他人则更加复杂,并且在您的程序清理过程中安静地运行,因为您或多或少地积极参与。

调查垃圾回收的最有趣的方法是在Sun 6 JDK中运行jvisualvm。它允许你看到许多与垃圾收集相关的许多内部事物。

https://visualvm.dev.java.net/monitor_tab.html(但最新的版本有很多更多)