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限定,或者根據實際情況計算後限定大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章