查看JVM使用的默認的垃圾收集器


查看JVM使用的默認的垃圾收集器

 

一、查看步驟

cmd執行命令:

java -XX:+PrintCommandLineFlags -version

輸出如下(舉例):

 

 針對上述的-XX:UseParallelGC,這邊我們引用《深入理解Java虛擬機:JVM高級特性與最佳實踐》的介紹:

 

也就是說,打開此開關,使用的垃圾收集器是:新生代(Parallel Scavenge),老年代(Ps MarkSweep)組合。

 

二、驗證下,是不是那么回事吧

我用ide起了一個程序,然后在main中進行長時間睡眠。啟動時,設置其VM 參數如下:

 

然后用Jconsole連接該程序,切換到VM概要這個tab,注意下圖紅圈圈出來的地方:

 

 結合第一步中的資料,很容易驗證,使用-XX:UseParallelGC的情況下,使用的垃圾收集器為:新生代(Ps Scanvenge),老年代(Ps MarkSweep)。

但不確定 Ps MarkSweep 就是Serial Old?  設置了 -XX:+UseParalleOldGC  發現 老年代還是顯示 Ps MarkSweep

 

三、Ps Scanvenge的簡要介紹

 

這邊附上我的簡單理解:該垃圾收集器適用於新生代,采用標記復制算法、多線程模型進行垃圾收集。

與其他新生代垃圾收集器的差別是,它更關注於吞吐量,而不是停頓時間。一般來說,需要與用戶交互的

程序更關注較短的停頓時間,而如果是需要達成盡量大的吞吐量的話,則該處理器會更加適合。

其通過-XX:UseAdaptiveSizePolicy參數,可以開啟其自動調節功能,適用於對垃圾收集器的調優不太了解的

用戶。

 

四、Serial Old的簡要介紹

我的理解:和其他老年代垃圾處理器一樣,都是使用的標記整理算法,(畢竟沒有靠山可以擔保,沒法復制,只能自己整理了,哎),

采用單線程處理模型。

 

五、Serial Old和Ps MarkSweep的區別

如上圖所示,也說了,在實際中,(正如第二節的截圖所示),實際應用中,大多使用的就是Ps MarkSweep。

Ps MarkSweep是以Serial Old為模板設計的,按照我們程序員的說法,估計是拷貝過來,改吧改吧出來的。

所以差不太多。

 

 

代碼查看垃圾收集器

List<GarbageCollectorMXBean> l = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean b : l) {
     System.out.println(b.getName());
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM