輕鬆永遠記住經典jvm參數

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。

上面這幾個參數我以前經常容易被混淆,不過後來根據字母拆分就簡單了很多。

如下圖:

輕鬆永遠記住經典jvm參數

還有幾個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參數之前文章有詳細講過,這裡就不再贅述了,具體看下圖:

輕鬆永遠記住經典jvm參數

配置的最後兩個參數介紹:

-XX:+PrintGCDetails:打印GC詳細信息;

-XX:SurvivorRatio=8:eden/survivor=8;


運行結果如下圖:

輕鬆永遠記住經典jvm參數

可以看到輸出了一些主要內容,對主要的內容解釋如下:

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。

在代碼中加入一個字節數組如下圖:

輕鬆永遠記住經典jvm參數

可以看到新生代的內存使用比上一個測試增加了512k(3243-2731=513),字節數組長度是512*1024,1024個字節等於1k。這說明數組確實存放到了堆的新生代!


四、總結

這個jvm參數是基於jdk8版本,在jdk9後參數設置進行了大改版,以後專門再去學習,不過學習瞭解jdk8的參數也是對jvm的學習,內容不會變,比較現在主流仍然是jdk8。

通過對參數的學習和測試,我們才能真正清楚參數起到的作用,並且只有實踐才能更好的理解。比如上面的測試知道數組在內存中的分配和佔用的大小,並且知道了我的jdk默認的垃圾收集器是Parallel Scavenge+Parallel Old。大家有興趣也可以測試下!


Java程序員日常學習筆記,如理解有誤歡迎各位交流討論!

輕鬆永遠記住經典jvm參數


分享到:


相關文章: