1、概述
2、對象已死嗎?
引用計數器
給對象添加一個引用計數器,每當有引用時,計數器加1,引用失效時,計數器減1;任何時刻計數器為0的對象就是不可能再被使用的。
若對象是循環引用,則無法處理。JVM不使用。
可達性分析算法
通過一系列的稱為“GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所經過的路徑稱為引用鏈(Reference Chain),當一個對象沒有任何引用鏈相連時,表明該對象不可用。
Java語言中,可作為 GC Roots的對象包括如下:
虛擬機棧(棧幀中的本地變量表)中引用的對象。
方法區中類靜態屬性引用的對象。
方法區中常量引用的對象。
本地方法棧中JNI(即一般說的Native方法)引用的對象。
Java中的引用:
強引用(Strong Reference) 類似“Object obj=new Object()”,這類的引用,只要強引用還存在,對象永遠不會被回收。
軟引用(Soft Reference)用來描述一些還有用但并非必需的對象。在系統將要發生內存溢出前,會對這類對象進行回收;如果這次回收還沒有足夠的內存,才會拋出內存溢出異常。SoftReference類來實現。
弱引用(Weak Reference) 非必需的對象,但強度比軟引用更弱一點。當垃圾收集器工作時,無論內存是否夠用,都會回收這類引用。WeakReference來實現。
虛引用(Phantom Reference)幽靈引用或幻影引用,最弱的一種引用關系,完全不對其生存時間構成影響,也無法通過虛引用來取得一個對象實例,唯一目的就是能在這個對象被收集器回收時收到一個系統通知,用PhantomReference來實現
3、垃圾收集算法
標記清除算法 Mark-Sweep
首先標記出所要回收的對象,在標記完成后統一回收所有被標記的對象??赡軙斐伤槠?。
復制算法Copying
將可用內存按容量劃分為大小相等的兩塊,每次中使用其中的一塊,當這一塊用完了,將存活的對象復制到另一塊中,然后把已使用的一塊清空。
每次對整個半區進行內存回收,也不用考慮內存d碎片;代價為只使用了內存的一半。
現在商業虛擬機都使用這種算法來回收 新生代,不過將內存分為較大的Eden和兩塊較小的Survior,每次只使用Eden和一塊Survior,回收時一次復制到另一塊Survivor,默認比例8:1:1.
標記-整理算法
與 標記-清除算法一樣,但是后續步驟是讓所有存活的對象都向一端移動,最后直接清理掉端邊界以外的內存。
分代收集算法 Generation Collection
根據對象存活周期的不同將內存劃分為幾塊

默認的,新生代與老年代的比例值為1:2(可以通過參數-XX:NewRatio來指定
Eden:from:to=8:1:1可以通過--XX:SurvivorRatio來指定
4、HotSpot的算法實現
枚舉根結點
從可達性分析中從GC Root節點找引用鏈的操作中,需要停頓所有Java執行線程(Stop The World, STW)。HotSpot的實現中使用一組稱為OopMap的數據結構來實現,當執行系統停頓下來后,并不需要一個不漏的檢查所有執行上下文和全局的引用位置。
安全點
安全區域
5、垃圾收集器
Serial收集器
單線程的收集器,必需暫停其他所有的工作線程,簡單而高效。
ParNew
Serial的多線程版本,暫停其它工作線程,啟用多個回收線程來回收。
Parallel Scavenge收集器
目標是達到一個可控制的吞吐量,吞吐量就是Cpu運行用戶代碼的時間和CPU總消耗時間的比值。
Serial Old收集器
Serial收集器的老年代版本。
Parallel Old收集器
老年代的Parallel Scavenge收集器,使用多線程和“標記-整理”算法。
CMS收集器 Concurrent Mark Sweep
以獲取最短回收停頓時間為目標的收集器
初始標記 (CMS initial mark), Stop the World,只是標記一下GC Roots能直接關聯到的對象,速度很快
并發標記(CMS concurrent mark),進行GC Roots Tracing的過程。
重新標記(CMS remark), Stop the World, 為了修正并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄
并發清除(CMS concurrent sweep)
G1收集器 Garbage-first
面向服務端應用的垃圾收集器
1、并發與關行。 充用利用多CPU、多核環境下的硬件優勢,來縮短Stop-The-World從停頓的時間,可以通過并發的文萃上java程序繼續執行
2、分代收集。 分不同的方式去處理新創建的對象和已經存活了一段時間、熬過多次GC的舊對象
3、空間整合。從整體來看是基于“標記-整理”算法的收集器,從局部上來看是基于“復制”算法實現的, 運行期間不會產生內存碎片,收集后能提供規整的可用內存。
4、可預測的停頓
Young Generation: Serial、ParNew、Parallel Scavenge、G1
Tenured(old) Generation:CMS、Serial Old、Parallel Old
6、內存分配和回收策略
對象優先在Eden分配,當Eden區沒有足夠空間分分配時,觸發一次GC
大對象直接進入老年代
長期存活的對象進行老年代
虛擬機給每個對象定義了一個對象年齡計數器,如果對象在Eden出生并經過第一次MinorGC后仍然存活,并且能被Survior容納的話,將被移動到Survivor空間中,并且對象年齡為1.
對象在Survivor中每一次Minor GC,年齡增加1,當年齡增加到一定程序,就晉升老年代
動態對象年齡判定
為了更好地適應不同程序的內存狀態,如果在Survivor空間中相同年齡所有對象大小的總和大于Survivorp空間的一半,年齡大于或等于該年齡的對象可以直接進入老年代
空間分配擔保
新聞熱點
疑難解答