1. 程式人生 > >jdk1.8限制記憶體引數

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,沒有再次出現持續上漲的情況