在未修改idea64.vmoptions时,默认配置为:
-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
发现以上配置在电脑上启动还是比较慢,使用以下命令查看GC情况如下。
jstat -gcutil 24544 3000
解释下这条命令的含义:24544为IDEA的PID,可以用jps命令工具看到,3000表示每隔3秒打印一次GC信息
结果如下:
image.png
在这之前,先解释下图里的字母的含义:
- S0、S1:两个Survivor区,E:Eden区,S0+S1+E代表新生代大小
- O:老年代
- M:Metaspace(元空间),其中存放永久代对象,相当于JDK7以及之前的PermGen,JDK8已经没有了PermGen Space的概念
- CCS:压缩类空间,具体含义没研究过
- YGC:Young(年轻代)GC次数,YGCT就是代表年轻代GC总时间
- FGC:Full GC次数,同理FGCT则表示Full GC总时间
- GCT:YGCT + FGCT的和
看到以上数据被吓到了,YGC没一会就到了70几次,FGC有10几次,受不了,这影响到启动速度,而且默认的配置文件没有限定最小堆空间和元空间大小,所以导致空间不足而频繁GC.
由于电脑是i7,16G内存,所以对JVM参数做了些调整,添加以下参数
-Xms2048m // 限制堆最小2G
-Xmx2048m // 限制堆最大2G
-Xverify:none // 取消加载的字节码的安全性验证,IDEA加载的类我们可以认为是安全的,可以提高载入速度
-XX:NewRatio=1 // 老年代与年轻代的比值为1:1
-XX:SurvivorRatio=6 // Eden区与单个Survivor区的比值为6:1
-XX:MetaspaceSize=512m // 元空间初始大小512M
再次使用jstat工具观察,结果如下:
image.png
看来情况好多了,启动时间相比有了好几秒的提升
网友评论