JVM學習——垃圾回收器不同,垃圾回收的機制也不同
阿新 • • 發佈:2018-12-09
一、問題
在學習深入理解Java虛擬機器(第二版)的3.6記憶體分配與回收策略中遇到了一個問題,就是程式碼清單3-5,3-6,3-7在執行結束後控制檯GC列印結果與書上的不同(這裡就不列舉我的列印結果了)。
二、問題解決與分析
後來查閱資料與部落格,以及仔細檢視書籍,發現列印結果和回收策略不同的根本原因在於對不同垃圾回收器的垃圾回收機制以及垃圾回收後的物件重新分配記憶體的機制不同(雖然所有的垃圾回收器具體細節不同,但是很多大體的策略是相同的).
1.問題的原因:
之前自己的電腦跑過tomcat,所以虛擬機器就自動將垃圾回收器調整成了Server預設使用的回收器,也就是ParallelGC
所以在Client端做測試時,發現垃圾回收和記憶體分配的機制與書上不同。
2.解決:設定垃圾回收器
-XX:+UseSerialGC,虛擬機器執行在Client模式下的預設值,Serial+Serial Old。
-XX:+UseParNewGC,ParNew+Serial Old,在JDK1.8被廢棄,在JDK1.7還可以使用。
-XX:+UseConcMarkSweepGC,ParNew+CMS+Serial Old。
-XX:+UseParallelGC,虛擬機器執行在Server模式下的預設值,Parallel Scavenge+Serial Old(PS Mark Sweep)。
-XX:+UseParallelOldGC,Parallel Scavenge+Parallel Old。
-XX:+UseG1GC,G1+G1。
由於我們的測試是在Client端,所以用SerialGC也就是預設的比較好,所以在程式執行之前設定JVM引數為-XX:+UseSerialGC就可以得到和書上相同的結果了