我有一个Java应用程序,它通常具有非常健康的垃圾收集统计信息。一个固定的收集通常每小时左右进行一次,STW部分只需要几秒钟。但奇怪的是,一个集合总是发生在应用程序启动的前五分钟。这是一个真正的问题,因为在那个时候,CPU的使用率已经比正常高得多(因为网络调用增加,最终会被缓存),所以这些暂停总是比正常长,如果我在非常重的负载下重新启动,甚至超过8秒。
以下是JVM args:
-Xms4096m
-Xmx4096m
-XX:PermSize=768m
-XX:MaxPermSize=768m
-XX:SurvivorRatio=6
-XX:NewSize=1024m
-verbose:gc
-XX:-DisableExplicitGC
-XX:+PrintGCDetails
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintTenuringDistribution
-XX:+HeapDumpOnOutOfMemoryError
-XX:MaxDirectMemorySize=2048m
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+PrintConcurrentLocks
-XX:+ExplicitGCInvokesConcurrent
这里的问题是,是什么触发了这个永久的集合,因为当它发生时,在旧代中有几乎2gb的空闲。以下是在正常情况下,在终身收藏之前的用法:
concurrent mark-sweep generation total 3145728K, used 2897098K
下面是在启动后的最初几分钟内触发一个永久集合之前的用法:
concurrent mark-sweep generation total 3145728K, used 1573655K
我的理解是,只有当老一代几乎满员时,才会出现终身收藏,否则会有什么触发它呢?
发布于 2014-09-29 19:34:38
CMS的一个关键概念是,它应该在空间耗尽之前开始收集,从而允许它同时运行。如果等到你用完了,它就会触发一个串行,停止这个世界的集合。
由于这个原因,有两个阈值可以确定何时过早地触发集合。
-XX:CMSInitiatingOccupancyFraction=90 (by default)
-XX+UseCMSInitiatingOccupancyOnly
如果您不设置这些指标,那么在什么时候开始使用“度量”就可以了。
我的理解是,只有当老一代几乎满员时,才能进行终身收藏;
这就是并行收集器所做的。
https://stackoverflow.com/questions/26107171
复制相似问题