Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在轻微gc后收集部分oldGen?_Java_Garbage Collection - Fatal编程技术网

Java 为什么在轻微gc后收集部分oldGen?

Java 为什么在轻微gc后收集部分oldGen?,java,garbage-collection,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:+UseCMSCo

这是我的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,混合模式)

ParNew只用于年轻人吗

你说得对:ParNew只收集youngGen对象

为什么ParNew之后oldGen的使用量会减少

事实并非如此

内括号外的数字用于总堆(年轻一代+老一代)

[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还要多

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

参考文献:

以下是对我的计算的一个很好的解释:

以下是一些关于ParNew、oldGen和youngGen的简单解释: