由于idea2016吃内存太厉害,所以我装了idea14.2版本,以下是默认的jvm参数:
JVM参数属性:
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djb.vmOptions=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.1.2\bin\idea64.exe.vmoptions
-Xbootclasspath/a:C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.1.2\lib\boot.jar
-Didea.paths.selector=IntelliJIdea14
找到idea进程号:通过window任务管理器,或者jps命令,或者直接查看jvisualvm(这个会更直观)
C:\Users\zyl>jps
5204 Jps
4428 Main
32336 RemoteMavenServer
14132
用jstat命令查看gc情况
C:\Users\zyl>jstat -gccause 14132
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
28.58 0.00 43.55 73.14 65.15 140 1.178 10 0.090 1.268 Allocation Failure No GC
C:\Users\zyl>jstat -gcutil 14132
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 52.88 29.65 72.15 65.13 123 1.018 10 0.090 1.108
启动完成后minor gc(也就是YGC) 123次,耗时1018 毫秒,full gc(FGC)10次,耗时90好毫秒,总共耗时1108毫秒,YGC执行次数太多,我们加大-Xmx=250m,来看看效果
第一次调优:
-Xms250m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djb.vmOptions=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.1.2\bin\idea64.exe.vmoptions
-Xbootclasspath/a:C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.1.2\lib\boot.jar
-Didea.paths.selector=IntelliJIdea14
通过jvisualvm查看
C:\Users\zyl>jstat -gcutil 1784
S0 S1 E O P YGC YGCT FGC FGCT GCT
77.64 0.00 42.94 65.16 61.69 70 0.846 6 0.067 0.913
再次查看gc统计情况:eden区堆内存最小值增加到250m,
YGC从原来的123次减少到现在的70次,耗时:846毫秒
FULL GC从原来的10次减少到6次,耗时:67 毫秒
总耗时:913毫秒,比原来减少了195毫秒
关闭idea开发工具
第二次调优:
我们加大-Xmx= 300m
jvm参数如下:
-Xms300m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
C:\Users\zyl>jstat -gcutil 7700
S0 S1 E O P YGC YGCT FGC FGCT GCT
62.24 0.00 41.57 77.43 63.64 24 0.729 14 0.342 1.071
再次查看gc统计情况:eden区堆内存最小值增加到300m,
YGC从原来的70次减少到现在的24次,耗时:729毫秒
FULL GC从原来的6次上升到14次,耗时:342毫秒
总耗时:1071毫秒,比原来增加了158毫秒
这次修改-Xms300m性能没有得到优化,反而启动时间更长,主要原因是full gc次数增加,说明新生代空间不足于存放新生代回收的对象,这种情况会直接把回收的对象存到老年代,导致老年代对象剧增,从而触发full gc,但是为什么-Xms=250m的时候full gc没那么频繁呢?,这个作为问题等下次验证。
关闭idea开发工具
第三次调优:
第二次调优失败,将-Xms重新设置为250m,在jvisualvm安装插件visual gc
从前两次调优看,minor gc的次数还是有点多,
我们用jmap -heap 11308查看下新生代大小:
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 786432000 (750.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 262144000 (250.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 367001600 (350.0MB)
G1HeapRegionSize = 0 (0.0MB)
我们将新生代大小调整到100m,减少新生代自动扩展次数,设置参数-Xmn=100m
调整后的参数如下:
-Xms250m
-Xmx750m
-Xmn100m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
启动idea,再通过jvisualvm查看,minor gc耗时:726.162毫秒,full gc耗时:163.961毫秒,总耗时:890.123毫秒
本次比第一次调优的913毫秒减少22毫秒,不是很明显
关闭idea开发工具
第四次调优:
我们将新生代大小调整到250m,固定大小等于MaxNewSize,设置参数-Xmn=250m,-Xms350m
调整后的参数如下:
-Xms350m
-Xmx750m
-Xmn250m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
启动idea,再通过jvisualvm查看,minor gc耗时:576.436毫秒,full gc耗时:259.889毫秒,总耗时:826.352毫秒
本次比第一次调优的913毫秒减少76毫秒,比默认启动加快281.648毫秒
到此调优结束,大家如果有更好的调优办法请告诉我,让idea启动更快哦
如果你用的是eclipse也可以用同样的方法调优
注意点:
每次调优,先修改idea64.exe.vmoptions,然后关闭idea,重新启动看性能调优