java - 为什么Java中有多个垃圾收集器?

标签 java garbage-collection

默认情况下,我在我的机器上启动的每个 Java 进程似乎都有两个垃圾收集器。我正在通过 JConsole 进行检查。

示例 - 对于我当前正在运行的 Eclipse。

PS MarkSweep

Collection Count - 221
Collection Time - 102118
Memory Pool Names - java.lang.String[4]

PS 清除

Collection Count - 241
Collection Time - 2428
Memory Pool Names - java.lang.String[2]

我假设它们有重叠的池。当使用相同的池(Eden、survivor、old gen)时,两个垃圾收集器如何协同工作?池之间的对象移动是否没有重叠(例如调用第二种算法时从一个幸存者到另一个幸存者的移动)?即使不是,为什么每个池需要多个收集器?

我已阅读 this article on GC .他们指的是对不同的主要和次要GC使用不同的收集器,但似乎没有提到在同一个池上使用多个收集器。

最佳答案

I am assuming they have overlapping pools.

这个假设是错误的。 PS Scavenge 将用于年轻(eden,survivor)代,PS MarkSweep 将用于老一代。唯一的“重叠”是 PS Scavenge 将在对象存在一段时间后将其移至老年代,然后让 PS MarkSweep 处理它们。

为不同的池使用不同的垃圾收集器的好处是,对伊甸池中的对象运行良好的算法不一定对老一代对象运行良好。

This article covers the various options for different garbage collectors working together.

至于在没有空间将对象移动到老年代时发生的“主要”收集,this (admittedly old) whitepaper from Sun说如下:

...the young generation collection algorithm is not run. Instead, the old generation collection algorithm is used on the entire heap.

关于java - 为什么Java中有多个垃圾收集器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16032328/

相关文章:

java - 在我的黑莓 CustomMenu 中调用 native MenuItem(切换应用程序、关闭等)

.net - GC.Add MemoryPressure() 如何知道要向哪个对象添加内存压力?

java - 尝试使用 android SDK 运行 "Panic"程序时出现 "Hello world"错误

java - 如何使用原因定义 “isValid”函数

java - Java 中更快的 GCD(n, m)?

c# - 如何在 C# 中有效地处理许多更新对象?

go - goroutine不会将内存返回操作系统

Java 同步计数器未按预期工作

java - 为什么java中的finalize()方法不在Finalizer类中?为什么它被定义在对象类中?

.net - ValueType 包装器的垃圾收集