首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >G1GC非常高的GC计数和CPU,非常频繁的GCs杀死性能。

G1GC非常高的GC计数和CPU,非常频繁的GCs杀死性能。
EN

Stack Overflow用户
提问于 2018-02-13 04:47:52
回答 1查看 9.3K关注 0票数 7

我最近将我的Java应用程序从CMS + ParNew切换到了G1GC。我在进行切换时观察到的是CPU使用率提高了,GC计数+暂停时间也增加了。在切换之前我的JVM标志是

代码语言:javascript
复制
 java -Xmx22467m -Xms22467m -XX:NewSize=11233m -XX:+UseConcMarkSweepGC -XX:AutoBoxCacheMax=1048576 -jar my-application.jar

开关之后,我的旗子是:

代码语言:javascript
复制
java -Xmx22467m -Xms22467m -XX:+G1GC -XX:AutoBoxCacheMax=1048576 -XX:MaxGCPauseMillis=30 -jar my-application.jar

我遵循甲骨文的最佳实践http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

代码语言:javascript
复制
Do not Set Young Generation Size

也没有设定年轻一代的尺寸。然而,我怀疑年轻一代的规模才是问题所在。我所看到的是堆的使用在6-8GB之间波动。

而以前,随着CMS和Par New的出现,内存使用量在4-16 GB之间增长,然后我才看到一个GC:

我不明白为什么在G1GC中GC这么频繁。当涉及到用G1GC进行GC调优时,我不确定我遗漏了什么。

我使用的是Java 8: ava版本"1.8.0_144“Java(TM) SE运行时环境(build 1.8.0_144-b01) Java HotSpot(TM) 64位服务器VM (build 25.144-b01,混合模式)

谢谢你的帮助。

UPDATE:关于这些暂停的更多信息:

正如您所看到的,所有这些暂停都是G1New,它们似乎与我的目标暂停时间(30 my )一样长。当我查看切换到G1GC之前的G1GC暂停时,它是这样的:

因此,它们也都是年轻的gen集合(ParNew),但它们的频率和时间都较短,因为只有当堆的使用量达到14 to左右(根据图表)时才会发生。

我仍然不知道为什么G1New发生得这么早(就堆的使用而言)。

更新2我还注意到NewRatio=2,我不知道G1GC是否尊重这一点,但这意味着我的新一代被限制在7GB。这就是原因吗?

更新3添加G1GC GC日志:0-AQdvb6vaBSYbkQcqn/view?usp=sharing

EN

回答 1

Stack Overflow用户

发布于 2018-02-16 00:24:52

我看到在复制对象上花费的时间是非常重要的。看起来,在将对象提升为终身生成之前,G1GC默认有15代。我把它减为1 (-XX:MaxTenuringThreshold=1)

另外,我也不知道如何在日志中确认这一点,不过,我在查看GC日志时看到,年轻一代正在不断地被调整大小,从最小大小到最大大小。我缩小了范围,这也提高了性能。

看看这里,https://docs.oracle.com/javase/9/gctuning/garbage-first-garbage-collector-tuning.htm#JSGCT-GUID-70E3F150-B68E-4787-BBF1-F91315AC9AB9,我试图找出粗化是否确实是一个问题。但是它只是说设置gc+remset=trace,我不知道如何在命令行中传递给java,如果它甚至可以在JDK 8中使用,我增加了XX:G1RSetRegionEntry,以防万一。

我希望这对未来的G1GC调谐器有所帮助,如果其他人有更多的建议,那就太好了。

我仍然看到,经过处理的缓冲区在年轻的疏散过程中仍然花费了很长的时间,而扫描RS在混合收集中的时间非常长。不知道为什么

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

https://stackoverflow.com/questions/48759638

复制
相关文章

相似问题

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