jdk8偷偷的占用了1G内存,你知道吗?

目录

  • 线上现象
  • 排查步骤
  • 相关实验(本地)
    • 复现现象
    • 优化方案一
    • 优化方案二
    • 方案三
  • 总结

线上现象

线上启动,莫名多占用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限定,或者根据实际情况计算后限定大小。

你可能感兴趣的:(工作笔记,java,算法,jvm,大数据,人工智能)