標籤:線程 互動 基於 5.0 清除 使用 左右 總結 ict
可以從不同的的角度去劃分記憶體回收演算法:
按照基本回收策略分
引用計數(Reference Counting):
比較古老的回收演算法。原理是此對象有一個引用,即增加一個計數,刪除一個引用則減少一個計數。記憶體回收時,只用收集計數為0的對象。此演算法最致命的是無法處理循環參考的問題。
標記-清除(Mark-Sweep):
此演算法執行分兩階段。第一階段從引用根節點開始標記所有被引用的對象,第二階段遍曆整個堆,把未標記的對象清除。此演算法需要暫停整個應用,同時,會產生記憶體片段。
複製(Copying):
此演算法把記憶體空間劃為兩個相等的地區,每次只使用其中一個地區。記憶體回收時,遍曆當前使用地區,把正在使用中的對象複製到另外一個地區中。次演算法每次只處理正在使用中的對象,因此複製成本比較小,同時複製過去以後還能進行相應的記憶體整理,不會出現“片段”問題。當然,此演算法的缺點也是很明顯的,就是需要兩倍記憶體空間。
標記-整理(Mark-Compact):
此演算法結合了“標記-清除”和“複製”兩個演算法的優點。也是分兩階段,第一階段從根節點開始標記所有被引用對象,第二階段遍曆整個堆,把清除未標記對象並且把存活對象“壓縮”到堆的其中一塊,按順序排放。此演算法避免了“標記-清除”的片段問題,同時也避免了“複製”演算法的空間問題。
按分區對待的方式分
增量收集(Incremental Collecting):即時記憶體回收演算法,即:在應用進行的同時進行記憶體回收。不知道什麼原因JDK5.0中的收集器沒有使用這種演算法的。
分代收集(Generational Collecting):基於對對象生命週期分析後得出的記憶體回收演算法。把對象分為年青代、年老代、持久代,對不同生命週期的對象使用不同的演算法(上述方式中的一個)進行回收。現在的記憶體回收行程(從J2SE1.2開始)都是使用此演算法的。
按系統線程分
串列收集:串列收集使用單線程處理所有記憶體回收工作,因為無需多線程互動,實現容易,而且效率比較高。但是,其局限性也比較明顯,即無法使用多處理器的優勢,所以此收集適合單一處理器機器。當然,此收集器也可以用在小資料量(100M左右)情況下的多處理器機器上。
並行收集:並行收集使用多執行緒記憶體回收工作,因而速度快,效率高。而且理論上CPU數目越多,越能體現出並行收集器的優勢。
並發收集:相對於串列收集和並行收集而言,前面兩個在進行記憶體回收工作時,需要暫停整個運行環境,而只有記憶體回收程式在運行,因此,系統在記憶體回收時會有明顯的暫停,而且暫停時間會因為堆越大而越長。
轉自:http://pengjiaheng.iteye.com/blog/520228
JVM調優總結(三)-基本記憶體回收演算法