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)
-
jstat情况
从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)
-
jstat情况
-
新的问题
优化后发现,次数大大减少,但是仍然存在FullGC,查看gc日志,添加新的参数将gc日志打印出来
添加参数:
-XX:+PrintGCDetails -verbose:gc -Xloggc:e/gc/gc.log
查看gc.log发现存在一次IDEA自己调用的System.gc(),从而导致了GCFull,通过加上参数-XX:+DisableExplicitGC来屏蔽这一gc,因为内存调优后,这种显式gc已经没有意义了。
进行屏蔽后时间进一步减少:
三. 其他参数优化
(去掉后发现,每次修改类以后都会问是否重新加载,很烦,卒,所以又加回去了= =)还有一个IDEA很耗时的是字节码验证,可以通过-Xverify:none去掉,这是去掉前后的对照时间:
最后我们给出完整的参数设置:
-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
完)。