线上现象
线上启动,莫名多占用1G系统内存。
排查步骤
- dump内存,并分析,无异常
- 通过总内存,jvm设置,确定是占用了堆外内存
相关实验(本地)
复现现象
设置jvm参数
-server
-Xms128m
-Xmx128m
通过jconsole可以看到compressedClassSpace开辟了1G的内存空间,实际未使用那么多
优化方案一
设置元空间大小
-server
-Xms128m
-Xmx128m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=128m
再次通过jconsole查看,发现compressedClassSpace和Metaspace空间大小相同
优化方案二
关闭compressedClassSpace
-server
-Xms128m
-Xmx128m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=128m
-XX:-UseCompressedClassPointers
or
-Xms128m
-Xmx128m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=128m
-XX:-UseCompressedOops
关闭UseCompressedClassPointers或者UseCompressedOops
compressedClassSpace都会被关闭
方案三
设置CompressedClassSpaceSize大小
-Xms128m
-Xmx128m
-XX:CompressedClassSpaceSize=256m
总结
根据线上的现象,在本地复现,然后测试、调优,实验出以上三种方案,可以解决CompressedClassSpaceSize默认1G大小的问题。具体CompressedClassSpaceSize要根据Metaspace限定,或者根据实际情况计算后限定大小。