最近在工作中发现idea编辑.java文件时有卡顿显现,百度,谷歌后发现大多数都是指向,配置idea内存和关闭语法检查关闭没用的插件,各种调优配置,本人都试过,发现都无法解决卡顿问题,下面说一下我的解决思路
mac系统:
1.使用mac活动监视器发现IDEA进程占用cpu超过400%
2.使用IDEA自带的性能监视器(Help-> Activity Monitor..)发现是compiler JIT 占用cpu
去网了解compiler JIT占用cpu的原因发现如下几点:
1.当codeCache耗尽时,如果codeCache占用内存没有被回收,就会导致编译线程无法继续,并且消耗大量cpu导致系统运行变慢(影响版本在jdk8和jdk7中,不过我用的jdk11不知道存不存在)
考虑这个问题首先就是增加codeCache和codeCache的回收
Help -> Edit Custom VM Options...
-XX:ReservedCodeCacheSize=1024m //增加codeCache容量
-XX:+UseCodeCacheFlushing //codeCache回收
重启idea发现cpu依旧占用严重,那就说明JVM在启动初期解释字节码进行执行,当方法执行次数达到指定阈值后,触发JIT把字节码编译成机器码,这个过程消耗CPU资源比较严重,我直接把所有代码编译成机器码,
Help -> Edit Custom VM Options...
-Xcomp //可以使jvm运行在纯编译模式下,所有方法在第一次被调用的时候就会被编译成机器代码
这样设置有一个弊端,第一次启动特别慢,之后就特别流畅,作为开发一般我们都不会关闭IDEA,这样这个方法都是可行的.
重启(2分钟左右) 再次编写发现cpu占用没有再400% ,保持在80%左右,至此解决idea卡顿问题,下面是我的配置
-Xms1024m
-Xmx1024m
-Xmn350m
-XX:ReservedCodeCacheSize=1024m
-XX:+UseConcMarkSweepGC
-Dfile.encoding=UTF-8
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Xverify:none
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:MetaspaceSize=1024m
-XX:+UseCodeCacheFlushing
-Xcomp
如果按照这样的配置idea无法启动按照如下修改
方法一
-XX:CompileThreshold=10 //在client下默认1500 在server下10000
-XX:-UseCounterDecay //关闭热度衰减
-XX:CompileThreshold 这个是方法调用计数器 -XX:CompileThreshold=10 表示方法在被执行10次后编译成机器码,
还需要-XX:-UseCounterDecay 关闭热度衰减,并且去掉
-Xcomp
方法二
-XX:OnStackReplacePercentage=34 // 在client下默认是933 server默认是140
-XX:OnStackReplacePercentage 这是方法回边计数器,当方法执行次数达到公式值后,就会触发编译成机器码
在 client 模式下设置为1
在 server 模式下设置为 34
去掉 -Xcomp 配置
Client模式下回边计数器阈值计算公式:
方法调用计数器阈值(-XX:CompileThreshold)× OSR比率(-XX:OnStackReplacePercentage)/ 100
-XX:OnStackReplacePercentage默认值为933
若都取默认值,计算结果(默认阈值)为13995
Server模式下回边计数器阈值计算公式:
方法调用计数器阈值(-XX:CompileThreshold)×(OSR比率(-XX:OnStackReplacePercentage)- 解释器监控比率(-XX:InterpreterProfilePercentage)/ 100
-XX:OnStackReplacePercentage默认值为140
-XX:InterpreterProfilePercentage默认值为33
若都取默认值,计算结果(默认阈值)为10700