摘要:現在,通過對這三種方式進行融合,出現了一些更加高級的方式。這樣一來,需要掃描的對象數量就會大幅減少。像這樣以全部區域為對象的操作被稱為完全回收或者大回收。在一般的算法中,作出這樣的保證是不可能的,因為產生的中斷時間與對象的數量和狀態有關。
jvm系列
垃圾回收基礎
JVM的編譯策略
GC的三大基礎算法
GC的三大高級算法
GC策略的評價指標
JVM信息查看
GC通用日志解讀
jvm的card table數據結構
Java類初始化順序
Java對象結構及大小計算
Java的類加載機制
Java對象分配簡要流程
年老代過大有什么影響
Survivor空間溢出實例
關于Object=null
Java線程與Xss
序GC的基本算法,大體上都逃不出標記清除法/標記壓縮法、復制收集算法、引用計數法這三種方式以及它們的衍生品?,F在,通過對這三種方式進行融合,出現了一些更加高級的方式。這里,我們介紹一下其中最有代表性的三種,即分代回收、增量回收和并行回收。有些情況下,也可以對這些方法中的幾種進行組合使用。
1、分代回收首先,我們來講講高級GC技術中最重要的一種,即分代回收(Generational GC)。由于GC和程序處理的本質是無關的,因此它所消耗的時間越短越好。分代回收的目的,正是為了在程序運行期間,將GC所消耗的時間盡量縮短。分代回收的基本思路,是利用了一般性程序所具備的性質,即大部分對象都會在短時間內成為垃圾,而經過一定時間依然存活的對象往往擁有較長的壽命。如果壽命長的對象更容易存活下來,壽命短的對象則會被很快廢棄,那么到底怎樣做才能讓GC變得更加高效呢?如果對分配不久,誕生時間較短的“年輕”對象進行重點掃描,應該就可以更有效地回收大部分垃圾。
在分代回收中,對象按照生成時間進行分代,剛剛生成不久的年輕對象劃為新生代(Young gen-eration),而存活了較長時間的對象劃為老生代(Old generation)。根據具體實現方式的不同,可能還會劃分更多的代,在這里為了講解方便,我們就先限定為兩代。如果上述關于對象壽命的假說成立的話,那么只要僅僅掃描新生代對象,就可以回收掉廢棄對象中的很大一部分。像這種只掃描新生代對象的回收操作,被稱為小回收(Minor GC)。小回收的具體回收步驟如下。首先從根開始一次常規掃描,找到“存活”對象。這個步驟采用標記清除或者是復制收集算法都可以,不過大多數分代回收的實現都采用了復制收集算法。需要注意的是,在掃描的過程中,如果遇到屬于老生代的對象,則不對該對象繼續進行遞歸掃描。這樣一來,需要掃描的對象數量就會大幅減少。然后,將第一次掃描后殘留下來的對象劃分到老生代。具體來說,如果是用復制收集算法的話,只要將復制目標空間設置為老生代就可以了;而用標記清除算法的話,則大多采用在對象上設置某種標志的方式。
從任何地方都沒有進行引用的老生代中的F對象,會通過大回收操作進行回收。
對來自老生代的引用進行記錄這個時候,問題出現了,從老生代對象對新生代對象的引用怎么辦呢?如果只掃描新生代區域的話,那么從老生代對新生代的引用就不會被檢測到。這樣一來,如果一個年輕的對象只有來自老生代對象的引用,就會被誤認為已經“死亡”了。因此,在分代回收中,會對對象的更新進行監視,將從老生代對新生代的引用,記錄在一個叫做記錄集(remembered set)的表中(圖5)。在執行小回收的過程中,這個記錄集也作為一個根來對待。
要讓分代回收正確工作,必須使記錄集的內容保持更新。為此,在老生代到新生代的引用產生的瞬間,就必須對該引用進行記錄,而負責執行這個操作的子程序,需要被嵌入到所有涉及對象更新操作的地方。這個負責記錄引用的子程序是這樣工作的。設有兩個對象:A和B,當對A的內容進行改寫,并加入對B的引用時,如果①A屬于老生代對象,②B屬于新生代對象,則將該引用添加到記錄集中。這種檢查程序需要對所有涉及修改對象內容的地方進行保護,因此被稱為寫屏障(Write barrier)。寫屏障不僅用于分代回收,同時也用在很多其他的GC算法中。雖說老生代區域中的對象一般來說壽命都比較長,但也決不是“不老不死”的。隨著程序的運行,老生代區域中的“死亡”對象也在不斷增加。為了避免這些死亡的老生代對象白白占用內存空間,偶爾需要對包括老生代區域在內的全部區域進行一次掃描回收。像這樣以全部區域為對象的GC操作被稱為完全回收(Full GC)或者大回收(Major GC)。分代回收通過減少GC中掃描的對象數量,達到縮短GC帶來的平均中斷時間的效果。不過由于還是需要進行大回收,因此最大中斷時間并沒有得到什么改善。從吞吐量來看,在對象壽命假說能夠成立的程序中,由于掃描對象數量的減少,可以達到非常不錯的成績。但是,其性能會被程序行為、分代數量、大回收觸發條件等因素大幅度左右。
2、增量回收在對實時性要求很高的程序中,比起縮短GC的平均中斷時間,往往更重視縮短GC的最大中斷時間。例如,在機器人的姿勢控制程序中,如果因為GC而讓控制程序中斷了0.1秒,機器人可能就摔倒了?;蛘撸绻囕v制動控制程序因為GC而延遲響應的話,后果也是不堪設想的。在這些對實時性要求很高的程序中,必須能夠對GC所產生的中斷時間做出預測。例如,可以將“最多只能中斷10毫秒”作為附加條件。在一般的GC算法中,作出這樣的保證是不可能的,因為GC產生的中斷時間與對象的數量和狀態有關。
因此,為了維持程序的實時性,不等到GC全部完成,而是將GC操作細分成多個部分逐一執行。這種方式被稱為增量回收(Incremental GC)。在增量回收中,由于GC過程是漸進的,在回收過程中程序本身會繼續運行,對象之間的引用關系也可能會發生變化。如果已經完成掃描和標記的對象被修改,對新的對象產生了引用,這個新對象就不會被標記,明明是“存活”對象卻被回收掉了。在增量回收中為了避免這樣的問題,和分代回收一樣也采用了寫屏障。當已經被標記的對象的引用關系發生變化時,通過寫屏障會將新被引用的對象作為掃描的起始點記錄下來。由于增量回收的過程是分步漸進式的,可以將中斷時間控制在一定長度之內。另一方面,由于中斷操作需要消耗一定的時間,GC所消耗的總時間就會相應增加,正所謂有得必有失。
3、并行回收最近的計算機中,一塊芯片上搭載多個CPU核心的多核處理器已經逐漸普及。不僅是服務器,就連個人桌面電腦中,多核CPU也已經成了家常便飯。例如美國英特爾公司的Core i7就擁有6核12個線程。在這樣的環境中,就需要通過利用多線程來充分發揮多CPU的性能。并行回收正是通過最大限度利用多CPU的處理能力來進行GC操作的一種方式。并行回收的基本原理是,是在原有的程序運行的同時進行GC操作,這一點和增量回收是相似的。不過,相對于在一個CPU上進行GC任務分割的增量回收來說,并行回收可以利用多CPU的性能,盡可能讓這些GC任務并行(同時)進行。由于軟件運行和GC操作是同時進行的,因此就會遇到和增量回收相同的問題。為了解決這個問題,并行回收也需要用寫屏障來對當前的狀態信息保持更新。不過,讓GC操作完全并行,而一點都不影響原有程序的運行,是做不到的。因此在GC操作的某些特定階段,還是需要暫停原有程序的運行。在多核化快速發展的現在,并行回收也成了一個非常重要的話題,它的算法也在不斷進行改善。在硬件系統的支持下,無需中斷原有程序的完全并行回收器也已經呼之欲出。今后,這個領域相當值得期待。
引用代碼的未來
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65634.html
摘要:它的基本原理是,在每個對象中保存該對象的引用計數,當引用發生增減時對計數進行更新。實現容易是引用計數算法最大的優點。引用計數最大的缺點,就是無法釋放循環引用的對象。為了避免這種情況的發生,對引用計數的操作必須采用獨占的方式來進行。 jvm系列 垃圾回收基礎 JVM的編譯策略 GC的三大基礎算法 GC的三大高級算法 GC策略的評價指標 JVM信息查看 GC通用日志解讀 jvm的card...
摘要:在一般應用中,不會逃逸的局部對象所占的比例很大,如果能使用棧上分配,那大量的對象就會隨著方法的結束而自動銷毀了,垃圾收集系統的壓力將會小很多。相關參數設置大對象直接進入年老代的閾值,當對象大小超過這個值時,將直接在年老代分配。 jvm系列 垃圾回收基礎 JVM的編譯策略 GC的三大基礎算法 GC的三大高級算法 GC策略的評價指標 JVM信息查看 GC通用日志解讀 jvm的card t...
摘要:系列垃圾回收基礎的編譯策略的三大基礎算法的三大高級算法策略的評價指標信息查看通用日志解讀的數據結構類初始化順序對象結構及大小計算的類加載機制對象分配簡要流程年老代過大有什么影響空間溢出實例關于線程與序本文主要講述如何查看應用的信息。 jvm系列 垃圾回收基礎 JVM的編譯策略 GC的三大基礎算法 GC的三大高級算法 GC策略的評價指標 JVM信息查看 GC通用日志解讀 jvm的car...
摘要:系列垃圾回收基礎的編譯策略的三大基礎算法的三大高級算法策略的評價指標信息查看通用日志解讀的數據結構類初始化順序對象結構及大小計算的類加載機制對象分配簡要流程年老代過大有什么影響空間溢出實例關于線程與序本文主要講述日志的解讀。 jvm系列 垃圾回收基礎 JVM的編譯策略 GC的三大基礎算法 GC的三大高級算法 GC策略的評價指標 JVM信息查看 GC通用日志解讀 jvm的card ta...
閱讀 811·2023-04-25 20:18
閱讀 2092·2021-11-22 13:54
閱讀 2527·2021-09-26 09:55
閱讀 3857·2021-09-22 15:28
閱讀 2969·2021-09-03 10:34
閱讀 1710·2021-07-28 00:15
閱讀 1629·2019-08-30 14:25
閱讀 1281·2019-08-29 17:16