Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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 为什么JVM继续执行完整的gc,而旧一代只完成了一半?_Java_Garbage Collection_Jvm Hotspot_Concurrent Mark Sweep - Fatal编程技术网

Java 为什么JVM继续执行完整的gc,而旧一代只完成了一半?

Java 为什么JVM继续执行完整的gc,而旧一代只完成了一半?,java,garbage-collection,jvm-hotspot,concurrent-mark-sweep,Java,Garbage Collection,Jvm Hotspot,Concurrent Mark Sweep,我在CentOS 64位linux机器上使用jdk 1.7.009 与gc相关的vm参数为 -Xmx4g-Xmn2g-XX:surviviorratio=4-XX:PermSize=128m-XX:MaxPermSize=128m-XX:InitialTenuringThreshold=15-XX:CMSWaitDuration=50-XX:MaxTenuringThreshold=15-XX:+useConmarksweepgc-XX:+UseParNewGC-XX:cmsinitiating

我在CentOS 64位linux机器上使用jdk 1.7.009

与gc相关的vm参数为

-Xmx4g-Xmn2g-XX:surviviorratio=4-XX:PermSize=128m-XX:MaxPermSize=128m-XX:InitialTenuringThreshold=15-XX:CMSWaitDuration=50-XX:MaxTenuringThreshold=15-XX:+useConmarksweepgc-XX:+UseParNewGC-XX:cmsinitiatingoccuncyfraction=80-XX:+cmsparallelremarked-XX:reserveddochesize=128m

但它一直在做完整的gc

jstat -gcutil pid 1000    
    S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
    0.00   0.00  15.62  57.52  19.90     11    2.081 11109 7454.686 7456.767   
    0.00   0.00  15.81  57.52  19.90     11    2.081 11109 7454.686 7456.767   
    0.00   0.00  15.81  57.51  19.90     11    2.081 11111 7454.892 7456.973   
    0.00   0.00  16.06  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.06  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.27  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.27  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.29  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.42  57.47  19.90     11    2.081 11114 7455.549 7457.629
    0.00   0.00  16.42  57.44  19.90     11    2.081 11115 7455.986 7458.067
尽管有“FGC”列,但它实际上并不是一个完整的GC。CMS正在做的是一个并发集合,以查看是否可以从旧集合(您可以看到它正在做的)中清除任何内容。判断这不是一个完整GC的方法是,一个完整GC清除伊甸园空间并从一个幸存者空间复制到另一个幸存者空间

我认为,你使用的选项越多,你就越有可能遇到令人惊讶的结果。我会坚持使用最少的选项,看看它的表现如何。只有当您知道他们总是有帮助时才添加选项

试着从

-mx4g -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC

这是正常的。如果您需要“-verbose:gc”,您可以看到“Full”集合实际上是一个并发集合(您指定了“-XX:+UseConcMarkSweepGC”),您还可以看到时间没有增加多少。这段时间是同时发生的,不会阻止世界。

我同意。使用的标志表明这是一个谷歌配置。如果你真的想要“-XX:InitialTenuringThreshold=15-XX:CMSWaitDuration=50-XX:MaxTenuringThreshold=15”,你应该知道为什么。(然后你就会知道它们并不重要)更糟糕的是,这些标志通常是纯粹的尽力而为,默认情况下已经启用,或者没有执行它们看起来要执行的操作。即使是
-ms
-mx
(通常称为
-Xms
-Xmx
)也不会像大多数人想的那样做。@FabianLange我们根据gc标志的不同设置对应用程序进行了基准测试,并最终解决了这个问题。我们知道一些配置只是一个建议。