对idea进行性能调优时遇到的一个问题

  今天在对idea进性能调优时,通过VisualVM的监测,发现在启动idea时,由于元空间(Metaspace)分配到的内存过小,导致JVM进行多次的Full GC。
对idea进行性能调优时遇到的一个问题_第1张图片
对idea进行性能调优时遇到的一个问题_第2张图片
对idea进行性能调优时遇到的一个问题_第3张图片
Metaspace ( 1.029G, 253.438M ) :237.898M
1.029G 表示最大可用空间,可以使用-XX:MaxPermSize指定永久代最大上限
253.438 表示当前永久代空间
237.898M 表示永久代当前占用空间
于是添加JVM参数-XX:MetaspaceSize=256m,重新启动idea并进行监测。
对idea进行性能调优时遇到的一个问题_第4张图片
对idea进行性能调优时遇到的一个问题_第5张图片
对idea进行性能调优时遇到的一个问题_第6张图片
分析结果时发现:
1. Full GC的次数确实降到了只有1次(有1次的原因是idea主动调用了System.gc())。
2. 元空间的大小一开始并不是我们自己所设定的256m(JVM参数:-XX:MetaspaceSize=256m),而是36691968B(约34.99MB),曲线与JVM在默认的参数下的情况类似,都是在不断上升,只不过上升的更陡峭。

  那么问题来了,我们不是通过参数-XX:MetaspaceSize=256m设置了Metaspace的初始大小为256m吗,但为什么没有起作用(从图中的元空间的大小曲线中可以看出)?可从实际效果来看,它又的的确确的生效了(Full GC的次数明显下降了)?
  查询相关资料得知以下几点:
1. 无论-XX:MetaspaceSize配置什么值,Metaspace的初始容量一定是21807104B(约20.8m)。至于为什么在监控时显示的初始值为36691968B(约34.99MB),我也不清楚。
用命令查询JVM参数的默认值java -XX:+PrintFlagsFinal,得到

uintx MetaspaceSize = 21807104 {pd product}
uintx MaxMetaspaceExpansion = 5451776 {product}
uintx MaxMetaspaceFreeRatio  = 70 {product}
uintx MaxMetaspaceSize = 4294901760 {product}
uintx MinMetaspaceExpansion = 339968 {product}
uintx MinMetaspaceFreeRatio = 40 {product}
  1. Metaspace由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生Full GC;且之后每次Metaspace扩容都会发生Full GC;
  2. Meta区容量范围为[20.8m, MaxMetaspaceSize);
  3. 如果MaxMetaspaceSize设置太小,可能会导致频繁Full GC,甚至OOM;

至此这个问题已经迎刃而解了。现在来回顾一下有关元空间的这几个参数:
1. -XX:MetaspaceSize=N
这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加也可能降低。在默认的情况下,这个值大小根据不同的平台在12M到20M浮动。在本机上该参数的默认值为21807104B(大约20.8M)。
2. -XX:MaxMetaspaceSize=N
这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294901760B(约4096MB)。
3. -XX:MinMetaspaceFreeRatio=N
当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。
4. -XX:MaxMetasaceFreeRatio=N
当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70,也就是70%。
5. -XX:MaxMetaspaceExpansion=N
Metaspace增长时的最大幅度。在本机上该参数的默认值为5451776B(约5.2MB)。
6. -XX:MinMetaspaceExpansion=N
Metaspace增长时的最小幅度。在本机上该参数的默认值为339968B(约332KB)。

你可能感兴趣的:(对idea进行性能调优时遇到的一个问题)