gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:08:29 26 4
gpt4 key购买 nike

默认情况下,我在我的机器上启动的每个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com