首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无明显原因开始的终身收藏

无明显原因开始的终身收藏
EN

Stack Overflow用户
提问于 2014-09-29 19:14:35
回答 1查看 72关注 0票数 0

我有一个Java应用程序,它通常具有非常健康的垃圾收集统计信息。一个固定的收集通常每小时左右进行一次,STW部分只需要几秒钟。但奇怪的是,一个集合总是发生在应用程序启动的前五分钟。这是一个真正的问题,因为在那个时候,CPU的使用率已经比正常高得多(因为网络调用增加,最终会被缓存),所以这些暂停总是比正常长,如果我在非常重的负载下重新启动,甚至超过8秒。

以下是JVM args:

代码语言:javascript
运行
复制
-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的空闲。以下是在正常情况下,在终身收藏之前的用法:

代码语言:javascript
运行
复制
concurrent mark-sweep generation total 3145728K, used 2897098K 

下面是在启动后的最初几分钟内触发一个永久集合之前的用法:

代码语言:javascript
运行
复制
concurrent mark-sweep generation total 3145728K, used 1573655K 

我的理解是,只有当老一代几乎满员时,才会出现终身收藏,否则会有什么触发它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-29 19:34:38

CMS的一个关键概念是,它应该在空间耗尽之前开始收集,从而允许它同时运行。如果等到你用完了,它就会触发一个串行,停止这个世界的集合。

由于这个原因,有两个阈值可以确定何时过早地触发集合。

代码语言:javascript
运行
复制
-XX:CMSInitiatingOccupancyFraction=90 (by default)
-XX+UseCMSInitiatingOccupancyOnly

如果您不设置这些指标,那么在什么时候开始使用“度量”就可以了。

我的理解是,只有当老一代几乎满员时,才能进行终身收藏;

这就是并行收集器所做的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26107171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档