熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

垃圾自動收集系統指導 (2)

2013-11-23 17:57:34  來源: Javascript 

  停止和復制
  標記和清除法的兄弟就是停止和復制收集法了停止和復制法解決了標記和清除法的碎片問題但是對內存提出了更高的要求(或者是對一個較小的對象池進行更加頻繁的收集)微軟的Java虛擬機使用的就是這個算法而在當時這是最快的虛擬機之一
  停止和復制法的原理是為對象創建兩個內存池但是每次只使用其中的一個在你分配對象的時候它就簡單地在活動的內存池中為你指定下一個可用空間如果內存池填滿了——或者如果系統決定該收集了——它就進行同標記和清除法相同動作跟蹤程序裡系統對象的所有指針但是不僅僅標記這些對象它把它們從當前的內存池裡復制到另一個非活動的內存池裡
  
  這個復制動作將活動著的對象一個一個安置到新的內存池裡一完成這個過程它就將原來這個原本非活動的內存池切換成活動的由於它只復制活動的對象所以垃圾對象被留了下來要收集的總是會比要扔掉的少復制這一過程事實上整理了新的內存池因為對象是一個接一個放置的
  停止和復制法仍然必須要停止正在運行的程序以收集對象並把它們移到內存池裡在這個算法運行的時候它在清理的應用程序會停下來導致程序的波動
  世代
  活動垃圾收集法的輪廓揭示了一些基礎性錯誤這些錯誤在垃圾收集算法如何工作同垃圾需要如何被收集比較時產生正在運行的應用程序的大多數對象只會存活很短的時間只有極少數會存活在應用程序運行的全過程中前面勾畫的算法平等地處理所有對象不幸的是每個活動的對象都需要被處理(例如移動標記)這會對性能造成負面影響長時間存活的對象是持續的——所以不需要——在每次收集時被移來移去
  
  當前像最新的Java Hotspot虛擬機裡使用的垃圾收集程序分別為新老對象創建各自的內存池這樣的新老對象叫做如果一個對象經歷了特定的收集次數(有的時候就一次但是次數依賴於收集程序)它就被從新內存池移到老內存池裡老內存池從本質上講收集的次數會更少這樣考慮的原因是既然這些對象已經存活了一段時間了它們會存活得更長
  這樣就大大降低了垃圾收集程序的負載一輪收集過程中就結束的短時間存活對象對收集程序的影響較小因為收集程序主要對存活的對象進行處理對老一代對象的收集要少得多這就減少了對老對象不必要的移動
  不同的代甚至可以有不同的算法來處理它們例如停止和復制法適用於新對象池因為它認為新對象結束得更快(對於非垃圾對象而言停止和復制法的性能耗費是線性的)對老一代的對象能夠采取額外的步驟以實現更加精確的算法因為對性能的要求不是問題
  好好利用垃圾收集
  盡管有各種好處垃圾收集法仍然會從正在運行的應用程序手中搶奪CPU要最小化這種影響的最好辦法其實很簡單少創建對象更少的對象需要更少收集操作理論上這會提高性能
  垃圾收集是邁向擺脫每日編程中一些難纏細節的堅實步驟這個問題是過去幾年討論的熱點現在所使用的技術已經很老了(從計算機領域來看)所以是該好好利用垃圾收集程序的時候了
  
  

From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25425.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.