1. 程式人生 > >JVM垃圾收集器-Serial收集器

JVM垃圾收集器-Serial收集器

       今天我給大家分享的是Serial收集器,垃圾收集器就是記憶體回收的具體實現。Java虛擬機器規範中對垃圾收集器應該如何實現並沒有任何規定,因此不同的廠商,不同的版本的虛擬機器所提供的垃圾收集器都可能會有很大的差別,並且一般都會提供引數供使用者根據自己的應用特點和要求組合出各個年代所使用的收集器,這裡討論的收集器基於Sun HotSpot虛擬機器1.6版Update22,這個虛擬機器包含的所有的收集器如圖所示。

                                

       上圖展示了7種作用於不同分代的收集器,如果兩個收集器之間存在連線,就說明它們可以搭配使用。在介紹這些收集器各自的特性之前,我們先來明確一個觀點:雖然我們是在對各個收集器進行比較,但並非為來挑選一個最好的收集器出來。因為直到現在為止還沒有最好的收集器出現,更加沒有萬能的收集器,所以我們喧雜的只是對具體應用最合適的收集器。

      現在我們來說說Serial收集器把,它是最基礎並且最早的收集器,曾經是虛擬機器新生代收集的唯一選擇。它是一個單執行緒的收集器,但它的”單執行緒“的意思並不僅僅是說明它只會使用一個CPU或一條收集執行緒去完成垃圾收集工作,更重要的是它在進行垃圾收集時,必須暫停其他所有的工作執行緒,直到收集結束。這項工作實際上是由虛擬機器在後臺自動發起和自動完成的,在使用者不可見的情況下把使用者的正常工作的執行緒全部停掉,這對很多應用來說都是難以接受的。

     對於這種惡劣的體驗,虛擬機器的設計者表示完全理解,但也表示非常委屈:“你媽媽在給你打掃房間的時候,肯定也會讓你老老實實地在椅子上或房間外待著,如果她一邊打掃,你一邊亂扔紙屑,這房間還能打掃完嗎?”這確實是一個合情合理的矛盾,雖然垃圾收集這項工作聽起來和打掃房間屬於一個性質,但實際上可能肯定還要比打掃房間複雜得多啊。  

                  

         其實它雖然存在自己的不足,但它依然是虛擬機器執行在Client模式下但預設新生代收集器。它有著優於其他收集器的地方:簡單而高效,對於限定單個CPU的環境來說,Serial收集器由於沒有執行緒互動的開銷,專心做垃圾收集自然可以獲得最高的單執行緒收集效率。在使用者的桌面應用場景中,分配給虛擬機器管理的記憶體一般來說不會很大,停頓時間完全可以控制在幾十毫秒最多一百多毫秒以內,只要不是頻繁發生,這點停頓還是可以接受的。所以,Serial收集器對於執行在Client模式下的虛擬機器來說是一個很好的選擇。