《深入理解Java虚拟机》读书笔记3--垃圾回收算法
轉(zhuǎn)載:http://blog.csdn.net/tjiyu/article/details/53983064
?
下面先來了解Java虛擬機垃圾回收的幾種常見算法:標(biāo)記-清除算法、復(fù)制算法、標(biāo)記-整理算法、分代收集算法、火車算法,介紹它們的算法思路,有什么優(yōu)點和缺點,以及主要應(yīng)用場景。
1、標(biāo)記-清除算法
???????標(biāo)記-清除(Mark-Sweep)算法是一種基礎(chǔ)的收集算法。
1、算法思路
???????"標(biāo)記-清除"算法,分為兩個階段:
(A)、標(biāo)記
??????首先標(biāo)記出所有需要回收的對象;
???????標(biāo)記過程如《Java虛擬機垃圾回收(一) 基礎(chǔ)》"2-4、判斷對象生存還是死亡"中所述--分為兩個標(biāo)記過程(詳細(xì)請參考前文):
(1)、第一次標(biāo)記
???????在可達(dá)性分析后發(fā)現(xiàn)對象到GC Roots沒有任何引用鏈相連時,被第一次標(biāo)記;
???????并且進(jìn)行一次篩選:此對象是否必要執(zhí)行finalize()方法;
???????對有必要執(zhí)行finalize()方法的對象,被放入F-Queue隊列中;????
(2)、第二次標(biāo)記
???????GC將對F-Queue隊列中的對象進(jìn)行第二次小規(guī)模標(biāo)記;
???????在其finalize()方法中重新與引用鏈上任何一個對象建立關(guān)聯(lián),第二次標(biāo)記時會將其移出"即將回收"的集合;
???????對第一次被標(biāo)記,且第二次還被標(biāo)記(如果需要,但沒有移出"即將回收"的集合),就可以認(rèn)為對象已死,可以進(jìn)行回收。
(B)、清除
??????兩次標(biāo)記后,還在"即將回收"集合的對象將被統(tǒng)一回收;
???????執(zhí)行過程如下圖:
2、優(yōu)點
???????基于最基礎(chǔ)的可達(dá)性分析算法,它是最基礎(chǔ)的收集算法;
???????而后續(xù)的收集算法都是基于這種思路并對其不足進(jìn)行改進(jìn)得到的;
3、缺點
???????主要有兩個缺點:
(A)、效率問題
???????標(biāo)記和清除兩個過程的效率都不高;
(B)、空間問題
???????標(biāo)記清除后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片;
???????這會導(dǎo)致分配大內(nèi)存對象時,無法找到足夠的連續(xù)內(nèi)存;
???????從而需要提前觸發(fā)另一次垃圾收集動作;
4、應(yīng)用場景
??????針對老年代的CMS收集器;
2、復(fù)制算法
???????"復(fù)制"(Copying)收集算法,為了解決標(biāo)記-清除算法的效率問題;
1、算法思路
???????(A)、把內(nèi)存劃分為大小相等的兩塊,每次只使用其中一塊;
???????(B)、當(dāng)一塊內(nèi)存用完了,就將還存活的對象復(fù)制到另一塊上(而后使用這一塊);
???????(C)、再把已使用過的那塊內(nèi)存空間一次清理掉,而后重復(fù)步驟2;????
??????執(zhí)行過程如下圖:
2、優(yōu)點
???????這使得每次都是只對整個半?yún)^(qū)進(jìn)行內(nèi)存回收;
???????內(nèi)存分配時也不用考慮內(nèi)存碎片等問題(可使用"指針碰撞"的方式分配內(nèi)存);
??????實現(xiàn)簡單,運行高效;
???????(關(guān)于"指針碰撞"請參考《Java對象在HotSpot虛擬機中的創(chuàng)建過程》)
3、缺點
(A)、空間浪費
??????可用內(nèi)存縮減為原來的一半,太過浪費(解決:可以改良,不按1:1比例劃分);
(B)、效率隨對象存活率升高而變低
??????當(dāng)對象存活率較高時,需要進(jìn)行較多復(fù)制操作,效率將會變低(解決:后面的標(biāo)記-整理算法);
4、應(yīng)用場景
??????現(xiàn)在商業(yè)JVM都采用這種算法(通過改良缺點1)來回收新生代;
新生代:新建的對象都放到新生代
老年代:多次回收沒有被回收的對象或者大對象
??????如Serial收集器、ParNew收集器、Parallel Scavenge收集器、、G1(從局部看);
5、HotSpot虛擬機的改良算法
(A)、弱代理論
???????分代垃圾收集基于弱代理論(weak generational hypothesis),具體描述如下:
???????(1)、大多數(shù)分配了內(nèi)存的對象并不會存活太長時間,在處于年輕代時就會死掉;
???????(2)、很少有對象會從老年代變成年輕代;
???????其中IBM研究表明:新生代中98%的對象都是"朝生夕死";
????????所以并不需要按1:1比例來劃分內(nèi)存(解決了缺點1);
(B)、HotSpot虛擬機新生代內(nèi)存布局及算法
??????????????????????(1)、將新生代內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間;
??????????????????????(2)、每次使用Eden和其中一塊Survivor;
??????????????????????(3)、當(dāng)回收時,將Eden和使用中的Survivor中還存活的對象一次性復(fù)制到另外一塊Survivor;
??????????????????????(4)、而后清理掉Eden和使用過的Survivor空間;
??????????????????????(5)、后面就使用Eden和復(fù)制到的那一塊Survivor空間,重復(fù)步驟3;
?????????默認(rèn)Eden:Survivor=8:1,即每次可以使用90%的空間,只有一塊Survivor的空間被浪費;
(C)、分配擔(dān)保
???????如果另一塊Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象時,這些對象將直接通過分配擔(dān)保機制(Handle Promotion)進(jìn)入老年代;
???????分配擔(dān)保在以后講解垃圾收集器執(zhí)行規(guī)則時再詳解;
???????更多請參考:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/generations.html#sthref16
3、標(biāo)記-整理算法
???????"標(biāo)記-整理"(Mark-Compact)算法是根據(jù)老年代的特點提出的。
1、算法思路
(1)、標(biāo)記
??????標(biāo)記過程與"標(biāo)記-清除"算法一樣;
(2)、整理
???????但后續(xù)不是直接對可回收對象進(jìn)行清理,而是讓所有存活的對象都向一端移動;
???????然后直接清理掉端邊界以外的內(nèi)存;
執(zhí)行過程如下圖:
2、優(yōu)點
(A)、不會像復(fù)制算法,效率隨對象存活率升高而變低
???????老年代特點:
???????對象存活率高,沒有額外的空間可以分配擔(dān)保;
???????所以老年代一般不能直接選用復(fù)制算法算法;
???????而選用標(biāo)記-整理算法;
(B)、不會像標(biāo)記-清除算法,產(chǎn)生內(nèi)存碎片
???????因為清除前,進(jìn)行了整理,存活對象都集中到空間一側(cè);
3、缺點
???????主要是效率問題:除像標(biāo)記-清除算法的標(biāo)記過程外,還多了需要整理的過程,效率更低;
4、應(yīng)用場景
???????很多垃圾收集器采用這種算法來回收老年代;
??????如Serial Old收集器、G1(從整體看);
4、分代收集算法
???????"分代收集"(Generational Collection)算法結(jié)合不同的收集算法處理不同區(qū)域。
1、算法思路
???????基于前面說的弱代理論,其實并沒有什么新的思想;
???????只是根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊;
???????這樣就可以根據(jù)各個年代的特點采用最適當(dāng)?shù)氖占惴?#xff1b;
???????一般把Java堆分為新生代和老年代;
(A)、新生代
???????每次垃圾收集都有大批對象死去,只有少量存活;
???????所以可采用復(fù)制算法;
(B)、老年代
???????對象存活率高,沒有額外的空間可以分配擔(dān)保;
??????使用"標(biāo)記-清理"或"標(biāo)記-整理"算法;
??????結(jié)合上面對新生代的內(nèi)存劃分介紹和上篇文章對Java堆的介紹,可以得出HotSpot虛擬機一般的年代內(nèi)存劃分,如下圖:
2、優(yōu)點??????
???????可以根據(jù)各個年代的特點采用最適當(dāng)?shù)氖占惴?#xff1b;?
3、缺點??????
???????仍然不能控制每次垃圾收集的時間;4、應(yīng)用場景
??????目前幾乎所有商業(yè)虛擬機的垃圾收集器都采用分代收集算法;
??????如HotSpot虛擬機中全部垃圾收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1(也保留);
轉(zhuǎn)載于:https://www.cnblogs.com/xiaolovewei/p/8027245.html
總結(jié)
以上是生活随笔為你收集整理的《深入理解Java虚拟机》读书笔记3--垃圾回收算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【基础中的基础】引用类型和值类型,以及引
- 下一篇: Java环境变量的设置