问题描述:内存8G,电脑开久IDEA了就卡,刚打卡项目也很卡。
下载VisualVm和VisualGc插件
原始参数:
-Xms 堆初始化大小:512m 这里还是会慢慢扩容 可以使用
# 强制JVM在启动时申请到足够的堆内存(否则IDEA启动时堆初始大小不足512m)
#-XX:+AlwaysPreTouch
-Xmx: 堆最大1024m
最后那句-Dcom就是开启JMX监控
打开JMX监控
分析:
垃圾收集耗时:2.489s 75次 其中
fullGC:触发8次,459.135ms,
MinorGc:触发67次,1.981s
最后一次是因为(MinorGC后存活对象大于每次minorGC后平均值)空间担保失败
JIT 30.249s
1024M堆内存,新生代:332.75 老年代:691.25
EDEN: 266.25M
S0:33.25
S1:33.25
OLD:691.25
元空间(跟方法区差不多):1.256G
调优思路: 降低元空间最大size,无需这么多
降低新生代GC,增加新生代空间。
老年代可以多开几个项目看看需要多少,由于我很多原因是内存爆满导致很卡,所以我设置成了
年轻代与老年代比例为1:2,老年代无需那么多空间。
JVM参数
-server
# 堆初始值占用3G,意味着IDEA启动即分配3G内存
-Xms2048m
# 堆最大值占用3G
-Xmx2048m
# 年轻代与老年代比例为1:2(默认值是1:4),降低年轻代的回收频率
-XX:NewRatio=2
# 3 表示2:3 占5分之1
-XX:SurvivorRatio=3
#降低元空间
-XX:MaxMetaspaceSize=800m
#保留代码占用的内存容量 默认48
-XX:ReservedCodeCacheSize=1024m
#增大软引用在JVM中的存活时长(堆空闲空间越大越久)
-XX:SoftRefLRUPolicyMSPerMB=50
#更换CMS收集器
-XX:+UseConcMarkSweepGC
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Dcom.sun.management.jmxremote
调优效果
垃圾收集耗时:1.918s 26次 其中
fullGC:触发6次,447.994ms,这里应该是IDEA手动调用system.gc(),可以看到内存是足够的,这里知道的读者可以补充一下,还可能是JVM自己手动触发的FullGC
MinorGc:触发20次,1.470s
-XX:ReservedCodeCacheSize=1024m 这个调大后,JIT编译代码放置在该区域,设置大该区域可以优化编译速度,也减少了GC次数
-XX:SoftRefLRUPolicyMSPerMB=50 增大软引用在JVM中的存活时长 减少GC次数
#更换CMS收集器
-XX:+UseConcMarkSweepGC 并发垃圾收集器 具体可以看下我JVM垃圾收集器的文章