JVM调优-基于VisualVM对IDEA调优

JVM调优-基于VisualVM对IDEA调优

最近在阅读《深入理解Java虚拟机》,书中对Eclipse进行了jvm调优,在本文我讲对IDEA进行调优。

一. 调优前的IDEA JVM情况

  • 参数情况

  • IDEA的参数在IDEA的bin目录下的idea64.exe.vmoptions(针对64位),另外一个idea.exe.vmoptions针对32位。下面给出默认的参数:

    -Xms128m
    -Xmx750m
    -XX:ReservedCodeCacheSize=240m
    -XX:+UseConcMarkSweepGC
    -XX:SoftRefLRUPolicyMSPerMB=50
    -ea
    -Dsun.io.useCanonCaches=false
    -Djava.net.preferIPv4Stack=true
    -Djdk.http.auth.tunneling.disabledSchemes=""
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:-OmitStackTraceInFastThrow
    
  • Visual VM内的情况数据(主要看GC和Monitor)
    JVM调优-基于VisualVM对IDEA调优
    JVM调优-基于VisualVM对IDEA调优JVM调优-基于VisualVM对IDEA调优

  • jstat情况
    JVM调优-基于VisualVM对IDEA调优
    从Heap和Metaspace的容量图可以看出,在启动过程中Heap和Metaspace都有扩容的过程,说明初始的内存不够。因此我们可以调大-Xmx和-Xms的值,以及通过添加一个初始较大的MetaspaceSize来优化。

    从jstat的情况可以看到我们进行了80次的MinorGC和12次FullGC,这显然是不合理的,我们很容易知道MinorGC的情况大多是由新生代大小太小导致的,所以我们通过调大-Xmn的值对预设一个较大的新生代大小。而FullGC在新生代问题解决后也随之解决,因为新生代在内存不够时会对老年代进行空间分配担保,导致出现FullGC的情况。

二. 内存优化

我们将参数改为以下:

-Xms1024m
-Xmx2048m
-Xmn512m
-XX:MetaspaceSize=256m
  • Visual VM内的情况数据(主要看GC和Monitor)
    JVM调优-基于VisualVM对IDEA调优
    JVM调优-基于VisualVM对IDEA调优
    JVM调优-基于VisualVM对IDEA调优

  • jstat情况
    JVM调优-基于VisualVM对IDEA调优

  • 新的问题

    优化后发现,次数大大减少,但是仍然存在FullGC,查看gc日志,添加新的参数将gc日志打印出来
    JVM调优-基于VisualVM对IDEA调优

    添加参数:

    -XX:+PrintGCDetails
    -verbose:gc
    -Xloggc:e/gc/gc.log
    

    查看gc.log发现存在一次IDEA自己调用的System.gc(),从而导致了GCFull,通过加上参数-XX:+DisableExplicitGC来屏蔽这一gc,因为内存调优后,这种显式gc已经没有意义了。
    进行屏蔽后时间进一步减少:
    JVM调优-基于VisualVM对IDEA调优

三. 其他参数优化

(去掉后发现,每次修改类以后都会问是否重新加载,很烦,卒,所以又加回去了= =)
还有一个IDEA很耗时的是字节码验证,可以通过-Xverify:none去掉,这是去掉前后的对照时间:
JVM调优-基于VisualVM对IDEA调优

最后我们给出完整的参数设置:

-Xms1024m
-Xmx2048m
-Xmn512m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:MetaspaceSize=256m
-XX:+DisableExplicitGC
-Xverify:none

完)。