jvm的參數有很多,必須知道參數分類並且記住面試常見的幾個參數。
一、jvm參數分類
根據jvm參數開頭可以區分參數類型,共三類:"-"、"-X"、"-XX",
標準參數(-):所有的JVM實現都必須實現這些參數的功能,而且向後兼容;
例子:-verbose:class,-verbose:gc,-verbose:jni……
非標準參數(-X):默認jvm實現這些參數的功能,但是並不保證所有jvm實現都滿足,且不保證向後兼容;
例子:Xms20m,-Xmx20m,-Xmn20m,-Xss128k……
非Stable參數(-XX):此類參數各個jvm實現會有所不同,將來可能會隨時取消,需要慎重使用;
例子:-XX:+PrintGCDetails,-XX:-UseParallelGC,-XX:+PrintGCTimeStamps……
二、關鍵參數詳解
最重要和常見的幾個參數如下:
■ -Xms20m :設置jvm初始化堆大小為20m,一般與-Xmx相同避免垃圾回收完成後jvm重新分。
■ -Xmx20m:設置jvm最大可用內存大小為20m。
■ -Xmn10m:設置新生代大小為20m。
■ -Xss128k:設置每個線程的棧大小為128k。
上面這幾個參數我以前經常容易被混淆,不過後來根據字母拆分就簡單了很多。
如下圖:
還有幾個GC的參數見名知意就不詳解了,後面測試會一一說明,主要的如下:
■ -verbose:gc:可以輸出每次GC的一些信息;
■ -XX:-UseConcMarkSweepGC:使用CMS收集器;
■ -XX:-UseParallelGC ;
■ -XX:-UseSerialGC;
■ -XX:CMSInitiatingOccupancyFraction=80 CMS gc,表示在老年代達到80%使用率時馬上進行回收;
■ -XX:+printGC;
■ -XX:+PrintGCDetails:打印GC詳情;
■ -XX:+PrintGCTimeStamps:打印時間戳;
三、jvm參數設置和測試
在idea設置jvm參數之前文章有詳細講過,這裡就不再贅述了,具體看下圖:
配置的最後兩個參數介紹:
-XX:+PrintGCDetails:打印GC詳細信息;
-XX:SurvivorRatio=8:eden/survivor=8;
運行結果如下圖:
可以看到輸出了一些主要內容,對主要的內容解釋如下:
PSYoungGen:其中PS是Parallel Scavenge的簡寫,整個就表示新生代採用了Parallel Scavenge收集器。
後面緊跟total參數:表示新生代使用內存9216k,只有9M是因為只計算了eden和from survivor,我們知道to survivor在jvm運行時是預留的,只有在回收的時候才會使用。剛剛設置新生代內存是10M、eden/survivor=8,剛剛驗證了配置參數。
eden space 8192K, 33% used:eden區域總共8192k,使用了33%。2731/8192約等於0.33。
from space 1024K, 0% used;
to space 1024K, 0%used:因為還沒有進行過回收所以兩個survivor區域都是空的;
ParOldGen total 10240K, used 0K:Par是Parallel Old的簡寫,所以老年代採用的是Parallel Old收集器進行垃圾回收。
Metaspace used 3312K:元空間,因為用的是本地內存,所以沒有total只有used。
在代碼中加入一個字節數組如下圖:
可以看到新生代的內存使用比上一個測試增加了512k(3243-2731=513),字節數組長度是512*1024,1024個字節等於1k。這說明數組確實存放到了堆的新生代!
四、總結
這個jvm參數是基於jdk8版本,在jdk9後參數設置進行了大改版,以後專門再去學習,不過學習瞭解jdk8的參數也是對jvm的學習,內容不會變,比較現在主流仍然是jdk8。
通過對參數的學習和測試,我們才能真正清楚參數起到的作用,並且只有實踐才能更好的理解。比如上面的測試知道數組在內存中的分配和佔用的大小,並且知道了我的jdk默認的垃圾收集器是Parallel Scavenge+Parallel Old。大家有興趣也可以測試下!
Java程序員日常學習筆記,如理解有誤歡迎各位交流討論!