線上現象
線上啓動,莫名多佔用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限定,或者根據實際情況計算後限定大小。