java - 为什么在minor gc之后回收了部分oldGen?

标签 java garbage-collection

这是我的 GC 选项:

 -Xms64G -Xmx64G -XX:NewSize=18G -XX:MaxNewSize=24G -XX:SurvivorRatio=4 -XX:PermSize=128M -XX:MaxPermSize=128M -XX:CMSFullGCsBeforeCompaction=1 -XX:MaxDirectMemorySize=512M -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 

和日志:

109.127: [GC109.127: [ParNew: 20971520K->4194304K(20971520K), 0.9867550 secs] 32497068K->16761687K(62914560K), 0.9868580 secs] [Times: user=17.50 sys=0.33, real=0.99 secs]
114.982: [GC114.982: [ParNew: 20971520K->4194304K(20971520K), 1.0146370 secs] 33538903K->17802909K(62914560K), 1.0147240 secs] [Times: user=17.14 sys=0.32, real=1.01 secs]
120.811: [GC120.811: [ParNew: 20971520K->4194304K(20971520K), 1.0029230 secs] 34580125K->18848154K(62914560K), 1.0030200 secs] [Times: user=17.08 sys=0.31, real=1.00 secs]

为什么在ParNew之后oldGen的使用率降低了? ParNew 只用于年轻一代吗?

我的 jvm 是 Java HotSpot(TM) 64 位服务器 VM(构建 24.60-b09,混合模式)

最佳答案

is ParNew only used for young Gen?

你是对的:ParNew 只收集 youngGen 对象。

Why the usage of oldGen is reduced after ParNew?

事实并非如此。

内部括号外的数字用于总堆(young+old gen)

[GC109.127: [ParNew: YoungGenBefore->YoungGenAfter(TotalYoungGen), 0.9867550 secs] TotalHeapBefore->TotalHeapAfter(TotalHeap), 0.9868580 secs] [Times: user=17.50 sys=0.33, real=0.99 secs]

实际上,在您的场景中,一些对象已从 youngGen 移动到 oldGen,这意味着 oldGen 实际上正在增长(乍一看有点棘手)。

以第一行为例:

109.127: [GC109.127: [ParNew: 20971520K->4194304K(20971520K), 0.9867550 secs] 32497068K->16761687K(62914560K), 0.9868580 secs] [Times: user=17.50 sys=0.33, real=0.99 secs]

我们看到从 youngGen 中删除了 20971520K-4194304K=16777216K 字节。 从总使用堆中删除此字节数,我们得到 32497068K-16777216K=15719852K。

但是我们可以看到总堆中还剩下 16761687K,这比我们计算的 15719852K 多。

这意味着 16761687K-15719852K=1041835K 由于 ParNew GC 从 youngGen 移动到 oldGen,因此仍然驻留在总堆内存中。

引用资料:

这是对我的计算的一个很好的解释:link

这里有一些关于 ParNew 和 oldGen 以及 youngGen 的简单解释:link

关于java - 为什么在minor gc之后回收了部分oldGen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28144435/

相关文章:

java - 在java中创建文件

java - 如何在功能接口(interface)/lambda 调用中传递 Object 对象

java - JVM CMS 垃圾收集问题

garbage-collection - 保守垃圾收集器

c# - 对象超出范围

java - 拦截器API : in a classic java project

java - CSV 文件中的值为空

Java:更新 ArrayList 中的 GUI 元素

actionscript-3 - As3内存泄漏? -如何从内存中垃圾收集新的as3声音对象?

javascript - Node JS : Named callback functions and Garbage collection