jdk1.8限制記憶體引數
centos7上java應用使用 java -jar -Xms512m -Xmx512m
引數啟動,限制不了記憶體,很快就會超過512m這個數,而且
還在不停的增長,大概在1.7G就會停止
增加各種引數-Xms512m -Xmx512m -XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=200m -XX:MaxDirectMemorySize=128m -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=3 -XX:+UseAdaptiveSizePolicy -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly
從prometheus監控上看,heap,noheap記憶體加起來佔用只有500M
安裝jprofilter工具檢視,有一個Compressed class space
空間,佔了1G
結果jdk1.8預設就打開了-XX:+UseCompressedClassPointers 這個引數,並且設定為1G。這個記憶體大小可通過-XX:CompressedClassSpaceSize
引數來控制
引數作用是設定Klass Metaspace的大小,預設1G
Klass Metaspace就是用來存klass的,klass是class檔案在jvm裡的執行時資料結構,沒有開啟壓縮指標,就不會有-XX:CompressedClassSpaceSize=1g這塊記憶體,但是jdk1.8裡應該是預設開啟的。並且,如果這塊記憶體會如果沒有滿會一直增加。
將啟動引數改為java -jar -server -Xms512m -Xmx512m -XX:CompressedClassSpaceSize=128m -XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=200m
,最終記憶體大小穩定在700多M,這裡是512m+128m,沒有再次出現持續上漲的情況