优化我的IDEA GC

作者: 阿飞的博客 | 来源:发表于2017-07-23 00:39 被阅读2121次

IDEA是个好东西,可以说是地球上最好的Java开发工具,但是偶尔也会卡顿,仔细想想IDEA也是Java开发的,会不会和GC有关,于是就有了接下来对IDEA的GC进行调优;

IDEA默认JVM参数:
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50

第一次优化

以默认参数启动完成后,利用jstat -gcutil pid 3s 查看GC情况:

Paste_Image.png
图中反应出了1个非常明显的问题:Old区会扩容。这是因为Xms和Xmx值不一致引起的;所以对JVM参数的第一个优化点就是Xms和Xmx;
第一次优化后的JVM参数为:
-Xms1024m
-Xmx1024m
-Xmn372m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50

第二次优化

经过第一次优化后,再次启动IDEA,得到如下的GC日志:

Paste_Image.png
很明显Metaspace会出现扩容的情况,所以第二次优化点为:-XX:MetaspaceSize和-XX:MaxMetaspaceSize
第二次优化后的JVM参数为:
-Xms1024m
-Xmx1024m
-Xmn372m
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50

说明:由于我用的是JDK8,所以删除了参数-XX:MaxPermSize=350m,取而代之的是-XX:MetaspaceSize=256m和-XX:MaxMetaspaceSize=512m,如果读者你用的是JDK7及以前的版本,那么请用-XX:PermSize=256m和-XX:MaxPermSize=512m

总结

经过第二次优化后,启动IDEA的GC情况如下:

Paste_Image.png

由图所示, GC情况比较健康了,没有FGC,且GCT有明显的下降,唯一的缺陷就是YGC的平均耗时过长,这是由于我的电脑配置较低,CPU是双核心的缘故,一般生产环境Linux服务器上YGC的时间是几十毫秒级别,超过100ms就要注意排查是否有问题了;

写在最后

加上几个经验参数,最终的JVM参数如下:
-Xms1024m
-Xmx1024m
-Xmn372m
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSScavengeBeforeRemark
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=3
-XX:SoftRefLRUPolicyMSPerMB=50

说明:

  • -XX:+UseParNewGC:显示声明Young区垃圾回收算法,也可以不显示声明(显示声明为了让JVM参数更易懂),因为Old区申明为CMS GC的话,Young区默认就是ParNew;
  • -XX:+CMSParallelRemarkEnabled:CMS的remark阶段多线程并行;该参数默认就是true,所以这里只是显示声明;
  • -XX:+CMSScavengeBeforeRemark:CMS GC前执行一次Minor GC,即YGC;
  • -XX:CMSInitiatingOccupancyFraction=75:如果Old区声明为CMS GC的话,该参数的默认值为92,比较大,建议调小到75,减少Promotion failed的概率;
  • -XX:+UseCMSInitiatingOccupancyOnly:只有当Old区达到75%时才触发CMS GC,如果不声明的话,还有很多种其他条件触发CMS GC;
  • -XX:+UseCMSCompactAtFullCollection:CMS是标记清理算法,每次回收后有内存碎片问题,该参数会整理内存碎片,但是会影响暂停时间;
  • -XX:CMSFullGCsBeforeCompaction=3:表示经过多少次foreground CMS GC后对Old区做一次压缩。由于UseCMSCompactAtFullCollection这个参数为true整理内存碎片时会影响性能,但是碎片问题也需要解决或者缓解。所以,设置适当调整该参数的值,在执行多次foreground CMS GC后才对Old区进行压缩;

写在最后:我们常说的CMS GC是Backgroud CMS GC, 会经历我们熟知的5个阶段: 初始化标记->并行标记->重新标记->并行清理->并行重置。而foreground CMS GC被触发时,会停止所有的java线程,同时终止Backgroud CMS GC,串行回收Old区的垃圾,对系统吞吐量和性能影响非常大;

相关文章

  • 优化我的IDEA GC

    IDEA是个好东西,可以说是地球上最好的Java开发工具,但是偶尔也会卡顿,仔细想想IDEA也是Java开发的,会...

  • GC 调优大纲

    一、优化前准备 GC工作原理 GC 日志 二、优化过程 确定优化目标 优化 验收优化结果

  • 性能优化 ②

    CPU的方面的优化: CPU优化方向: 1、DrawCalls 2、物理组件(Physics) 3、GC(GC为处...

  • Java GC & Android GC学习索引

    目录 Java GC 知识 Android GC 知识 Android 内存优化 工具使用 Java GC 知识 ...

  • 理解CMS GC日志

    准备工作,配置输出GC日志 本文以idea的启动日志为例解读CMS收集器的GC日志在idea64.exe.vmop...

  • 查看gc日志

    在idea配置参数,即可看到GC日志

  • Android——内存泄漏

    性能优化----内存泄漏优化 一:什么是内存泄漏:内存不再GC的掌控之内了 了解几个问题(1) 垃圾回收机制 GC...

  • GC优化

    1、避免在update里面new对象 2、避免在update里面使用匿名委托 3、避免update里面GetCom...

  • idea vm参数优化

    idea vm参数优化 idea 吃内存且比较卡,看了下vmoption,发现几乎没有配置,于是优化了下,优化完后...

  • JVM系列(九):如何优化Java GC

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作。 Sangmin ...

网友评论

    本文标题:优化我的IDEA GC

    本文链接:https://www.haomeiwen.com/subject/sndpkxtx.html