四、Serial + Serial Old 收集器 和 ParNew 收集器


1、Serial 收集器

      Serial 收集器是新生代的單線程收集器,它“單線程”的意義體現在:
      1.它只會使用一個CPU或一條收集線程去完成垃圾收集工作;
      2.它在進行垃圾收集時,必須暫停其他所有的工作線程(既Stop The World),直到它收集結束。
      Stop The World是由虛擬機在后台自動發起和自動完成的,在用戶不可見的情況下把正常的工作線程全部停掉,這對很多應用來說都是難以接收的,應該盡量避免Stop The World。

2、Serial Old 收集器

      Serial Old 收集器是老年代的單線程收集器,使用“標記-整理”算法,除了與新生代的Serial收集器配合之外,Serial Old 收集器的另一種用途就是作為CMS收集器的后備預案,在並發收集發生Concurrent Mode Failure時使用。

3、Serial + Serial Old

      Serial 和 Serial Old雖然是單線程收集器,但它有着優於其他收集器的地方,簡單而高效(與其他收集器的單線程相比),對於限定單個CPU的環境來說,它們由於沒有線程交互的開銷,專心做垃圾收集自然可以獲得最高的單線程收集效率。

4、ParNew 收集器

      ParNew收集器是新生代收集器,它是Serial收集器的多線程版本,除了使用多條線程進行垃圾收集之外,其余行為包括Serial收集器可用的所有控制參數(例如:-XX:SurvivorRatio-XX:PretenureSizeThreshold-XX:HandlePromotionFailure等)、收集算法、Stop The World、對象分配規則、回收策略等都與Serial收集器完全一樣,在實現上,這兩種收集器也共用了相當多的代碼。
       ParNew 收集器除了多線程收集之外,其他與Serial收集器相比沒有太多創新之處,但它卻是許多運行在Server模式下的虛擬機鍾首選的新生代收集器,其中一個與性能無關但很重要的原因是,除了Serial收集器外,目前只有它能與CMS收集器配合工作。
       ParNew 收集器在單CPU的環境中絕對不會有比Serial收集器更好的效果,甚至由於存在線程交互的開銷,該收集器在通過超線程技術實現的兩個CPU的環境中都不能百分百地保證可以超越Serial收集器。當然,隨着可以使用的CPU的數量的增加,它對與GC時系統資源的有效利用還是很有好處的。它默認開啟的收集線程數與CPU的數量相同,在CPU非常多(譬如32個)的情況下,可以使用-XX:ParallelGCThreads參數來限制垃圾收集的線程數。

5、並行(Parallel)和並發(Concurrent)

      並行(Parallel)收集器:指多條垃圾收集線程並行工作,但此時用戶線程仍然處於等待狀態;
      並發(Concurrent)收集器:指用戶線程與垃圾收集線程同時執行(但不一定是並行的,可能會交替執行),用戶程序在繼續運行,而垃圾收集程序運行於另一個CPU上。

參考資料
1.《深入理解Java虛擬機:JVM高級特性與最佳實踐》(第2版);
2.Java HotSpot Virtual Machine Garbage Collection Tuning Guide Release 8


免責聲明!

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



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