idea内存与功能调优
Posted 晨港飞燕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了idea内存与功能调优相关的知识,希望对你有一定的参考价值。
一.内存显示设置
效果
显示设置
2020.1版本
双击Shift
二.idea运行内存设置
我的是16G
通过 Help - Edit Custom VM Options...
菜单设置配置,IntelliJ会优先使用这个地方的配置文件
编辑idea64.exe.vmoptions文件,(2020默认配置的CMS回收器)
-Xms2048m
-Xmx2048m
-XX:ReservedCodeCacheSize=1024m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=100
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
-javaagent:C:\\Users\\Public\\.jetbrains\\jetbrains-agent-v3.2.1.c46b.ed7=by https://zhile.io
2021默认使用的G1回收器
-Xms128m
-Xmx2004m
-XX:ReservedCodeCacheSize=512m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:CICompilerCount=2
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-ea
-Dsun.io.useCanonCaches=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-Djdk.attach.allowAttachSelf=true
-Djdk.module.illegalAccess.silent=true
-Dkotlinx.coroutines.debug=off
G1垃圾回收与CMS垃圾回收有什么区别呢
Intellij IDEA 设置启动JVM参数 https://www.cnblogs.com/hongdada/p/10238758.html
CMS垃圾回收器和G1垃圾回收器区别 https://blog.csdn.net/shlgyzl/article/details/95041113java常用垃圾回收器G1和CMS有什么区别https://blog.csdn.net/qq_45901741/article/details/115683354
G1 与 CMS 两个垃圾收集器的对比 https://www.cnblogs.com/javago/p/14433416.html
G1垃圾回收器介绍与CMS区别:http://blog.itpub.net/69990087/viewspace-2753935/
CMS垃圾回收与G1垃圾回收的比较请参见:http://colobu.com/2015/04/14/G1-Getting-Started/
G1垃圾回收器介绍与CMS区别 https://my.oschina.net/jayhu/blog/4900556
JVM虚拟机垃圾回收CMS和G1的区别 https://www.pianshen.com/article/5063815942/
CMS 和 G1 垃圾回收器 https://zhuanlan.zhihu.com/p/59995724
参数作用:
-Xms 设置初时的内存大小,提高Java程序的启动速度
-Xmx 设置最大内存数,提高该值,可以减少内存Garage收集的频率,提高程序性能
-XX:ReservedCodeCacheSize 设置代码内存容量
-XX:+UseParNewGC 使用并行收集算法
-server 控制内存garage方式,这样你无需在花一到两分钟等待内存garage的收集
JVM参数:-XX:ReservedCodeCacheSize
这个参数主要设置codecache的大小,比如我们jit编译的代码都是放在codecache里的,所以codecache如果满了的话,那带来的问题就是无法再jit编译了,而且还会去优化。因此大家可能碰到这样的问题:cpu一直高,然后发现是编译线程一直高(系统运行到一定时期),这个很大可能是codecache满了,一直去做优化。
代码缓存默认大小:
附网上查询的关于这个参数的一些描述:
JVM一个有趣的,但往往被忽视的内存区域是“代码缓存”,它是用来存储已编译方法生成的本地代码。代码缓存确实很少引起性能问题,但是一旦发生其影响可能是毁灭性的。如果代码缓存被占满,JVM会打印出一条警告消息,并切换到interpreted-only 模式:JIT编译器被停用,字节码将不再会被编译成机器码。因此,应用程序将继续运行,但运行速度会降低一个数量级,直到有人注意到这个问题。就像其他内存区域一样,我们可以自定义代码缓存的大小。相关的参数是-XX:InitialCodeCacheSize 和-XX:ReservedCodeCacheSize,它们的参数和上面介绍的参数一样,都是字节值。
如果依然报low memory:www.jianshu.com/p/06dd4ed371d2
-XX:MaxMetaspaceSize=2048m
三.方法区内存大小设置
1.方法区的大小可以不是固定的,JVM可以根据应用需要自动调整。
a)JDK7及以前(了解):-XX:PermSize设置永久代初始大小。-XX:MaxPermSize设置永久代最大可分配空间。(JDK7目前已经很少用了,这两个参数在JDK8及以后已经没有了,所以不必掌握,了解一下)
JDK8及以后:可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置元空间初始大小以及最大可分配大小。
参数解释:
-XX:MetaspaceSize:设置元空间大小
-XX:MaxMetaspaceSize:设置元空间最大大小
Java8以后,永久代被元空间取代,同时元空间不像永久代一样受制于堆内存,元空间是基于操作系统内存的,理论上讲,可以一直扩展内存直到操作系统的极限,所以设置元空间大小时,建议加上-XX:MaxMetaspaceSize参数,给个范围限制,避免元空间占用的内存一直增长。
1.如果不指定元空间的大小,默认情况下,元空间最大的大小是系统内存的大小,元空间一直扩大,虚拟机可能会消耗完所有的可用系统内存。
2.如果元空间内存不够用,就会报OOM。
3.默认情况下,对应一个64位的服务端JVM来说,其默认的-XX:MetaspaceSize值为21MB,这就是初始的高水位线,一旦元空间的大小触及这个高水位线,就会触发Full GC并会卸载没有用的类,然后高水位线的值将会被重置。
4.从第3点可以知道,如果初始化的高水位线设置过低,会频繁的触发Full GC,高水位线会被多次调整。所以为了避免频繁GC以及调整高水位线,建议将-XX:MetaspaceSize设置为较高的值.
具体设置多大,建议稳定运行一段时间后通过jstat -gc pid确认且这个值大一些,对于大部分项目256m即可。
由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般将这两个值都设置为256M(PS:读者可以根据自己的实际情况再调整)。
也有人不建议设置为一样的值,因为一旦系统因为元空间达到max 后果不堪设想
参数MetaspaceSize 通知回收就是一个保障机制, 而max可以设置更高 或者不设置
参数MetaspaceSize 应该设置一个基于系统的理论高值, 比如256M 这样一般不会触发 但是一旦触发还有一个到达MAX的缓冲值, 让程序员可以关注这片区域,如果参数MetaspaceSize和 maxSize设置一致, 那么出问题就无力回天了
补充
/*************************************************************************************************************/
-XX:MetaspaceSize这个JVM参数是指Metaspace扩容时触发FullGC的初始化阈值,也是最小的阈值。这里有几个要点需要明确:
1.无论-XX:MetaspaceSize配置什么值,Metaspace的初始容量一定是21807104(约20.8m);
2.Metaspace由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生FGC;且之后每次Metaspace扩容都会发生FGC;
3.如果老年区配置CMS垃圾回收,那么第2点的FGC也会使用CMS算法进行回收;
4.Meta区容量范围为[20.8m, MaxMetaspaceSize);
5.如果MaxMetaspaceSize设置太小,可能会导致频繁FGC,甚至OOM;
无论-XX:MetaspaceSize和-XX:MaxMetaspaceSize两个参数如何设置,都会从20.8M开始,随着类加载越来越多不断扩容调整,上限是-XX:MaxMetaspaceSize,默认是几乎无穷大。
而JDK7中的Perm的话,通过配置-XX:PermSize以及-XX:MaxPermSize来控制这块内存的大小,jvm在启动的时候会根据-XX:PermSize初始化分配一块连续的内存块,这样的话,如果-XX:PermSize设置过大,就是一种赤果果的浪费。很明显,Metapsace比Perm好多了
/*************************************************************************************************************/
G1垃圾回收与CMS垃圾回收有什么区别呢
Intellij IDEA 设置启动JVM参数 https://www.cnblogs.com/hongdada/p/10238758.html
CMS垃圾回收器和G1垃圾回收器区别 https://blog.csdn.net/shlgyzl/article/details/95041113
java常用垃圾回收器G1和CMS有什么区别 https://blog.csdn.net/qq_45901741/article/details/115683354
G1 与 CMS 两个垃圾收集器的对比 https://www.cnblogs.com/javago/p/14433416.html
G1垃圾回收器介绍与CMS区别:http://blog.itpub.net/69990087/viewspace-2753935/
CMS垃圾回收与G1垃圾回收的比较请参见:http://colobu.com/2015/04/14/G1-Getting-Started/
G1垃圾回收器介绍与CMS区别 https://my.oschina.net/jayhu/blog/4900556
JVM虚拟机垃圾回收CMS和G1的区别 https://www.pianshen.com/article/5063815942/
CMS 和 G1 垃圾回收器 https://zhuanlan.zhihu.com/p/59995724
参考:
https://blog.csdn.net/weixin_38106322/article/details/109004181
https://blog.csdn.net/u011069294/article/details/107393331
https://www.jianshu.com/p/1fcb8fdb3359
https://www.cnblogs.com/javaadu/p/11742562.html
四.idea其他设置
项目运行内存
指定构建过程所需的堆大小。
maven导入
VM options for importer:可以设置导入的VM参数,一般这个都不需要主动改,除非项目真的导入太慢了我们再增大此参数,比如IDEA 新建maven项目 一直停在 loading archetype list
单行显示多个Tabs
File–>settings–>Editor–>General -->Editor Tabs–>去掉√
参考:
https://blog.csdn.net/zeal9s/article/details/83544074
https://www.cnblogs.com/qinxu/p/9706454.html
http://blog.oneapm.com/apm-tech/426.html
https://blog.csdn.net/lidf1992/article/details/75050219
以上是关于idea内存与功能调优的主要内容,如果未能解决你的问题,请参考以下文章