天天看點

JVM垃圾收集器-Serial收集器

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

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

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

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

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

繼續閱讀