新聞中心
一.概述
學(xué)習(xí)Java的我們都知道垃圾收集(GC),大部分人把這項(xiàng)技術(shù)當(dāng)作是Java語(yǔ)言的伴生產(chǎn)物。事實(shí)上,GC的歷史比Java久遠(yuǎn),1960年誕生于MIT的Lisp是第一門真正使用內(nèi)存動(dòng)態(tài)分配和垃圾收集技術(shù)的語(yǔ)言。那我們今天就研究下垃圾收集原理。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),福安企業(yè)網(wǎng)站建設(shè),福安品牌網(wǎng)站建設(shè),網(wǎng)站定制,福安網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,福安網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
二.對(duì)象已死嗎?
Java的垃圾回收主要是對(duì)堆內(nèi)存的回收,里面存放著Java幾乎所有的對(duì)象實(shí)例,垃圾回收之前是要確定哪些還“存活”,哪些已經(jīng)“死去”。
1.引用計(jì)數(shù)器法
給對(duì)象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有地方對(duì)他進(jìn)行引用時(shí)計(jì)數(shù)器值1;當(dāng)引用失效時(shí),計(jì)數(shù)器值就1,任何時(shí)候計(jì)數(shù)器值為0的時(shí)候表示對(duì)象不可能在使用的。
2.可達(dá)性分析算法
通過(guò)一系列稱為“GC Roots”的對(duì)象作為起點(diǎn),從這些節(jié)點(diǎn)往下搜索,搜索所走過(guò)的路徑稱為“引用鏈”,當(dāng)一個(gè)對(duì)象到“GC Roots”沒有任何引用鏈相連時(shí),則證明對(duì)象是不可用的。
代碼示例:
GC日志如下:
我們很明顯的看到GC日志中6092K->456K,意味著虛擬機(jī)并沒有因?yàn)檫@兩個(gè)對(duì)象互相引用而不回收他們,所以Java虛擬機(jī)使用的是可達(dá)性分析算法標(biāo)記的。
其實(shí)即使被可達(dá)性分析算法標(biāo)記的不可達(dá)對(duì)象也不是一定會(huì)被回收的,虛擬機(jī)會(huì)對(duì)這些對(duì)象進(jìn)行一次篩選,篩選的條件是此對(duì)象是否有必要執(zhí)行finalize()方法。當(dāng)對(duì)象沒有覆蓋finalize()方法或者finalize()已經(jīng)被虛擬機(jī)調(diào)用過(guò),虛擬機(jī)將這兩種情況視為“沒有必要執(zhí)行”。如果對(duì)象被判定有必要執(zhí)行,finalize()方法是并在finalize()中與“GC Roots”建立關(guān)聯(lián),則此對(duì)象不會(huì)被回收了。
三.垃圾回收算法
我們知道了虛擬機(jī)怎么標(biāo)記一個(gè)對(duì)象是否可用,那他怎么進(jìn)行回收的呢?其實(shí)堆內(nèi)存可以分為新生代和老年代,新生代又被劃分為一個(gè)Eden和兩個(gè)Survivor區(qū)域,他們的比例為8:1:1,不同的垃圾收集器廠商對(duì)這兩個(gè)區(qū)域給出了不同的算法。
1.新生代——復(fù)制算法
新生代對(duì)象的特點(diǎn)就是,大部分對(duì)象在一次GC中會(huì)被回收掉,所以使用的是復(fù)制算法:新生代每次創(chuàng)建對(duì)象的時(shí)候只會(huì)使用一個(gè)Eden和其中的一塊Survivor,在垃圾回收時(shí)將存活的對(duì)象復(fù)制到另外一塊Survivor區(qū)域,最后清理掉Eden和剛才的Survivor區(qū)域。
2.老年代——標(biāo)記-整理算法
老年代一般保存的是一些大對(duì)象,或者不被經(jīng)?;厥盏膶?duì)象,根據(jù)特點(diǎn)使用的標(biāo)記-整理算法:如同名字一樣,算法分為“標(biāo)記”和“整理”兩個(gè)階段:首先先標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象進(jìn)行整理,將被標(biāo)記的對(duì)象都向一端移動(dòng),然后直接清理掉邊界以外的內(nèi)存。
四.HotSpot算法實(shí)現(xiàn)
上面說(shuō)了我們?cè)趺礃?biāo)記對(duì)象“死亡”和怎么進(jìn)行垃圾回收的,但在HotSpot虛擬機(jī)在實(shí)現(xiàn)這些算法上是必須對(duì)算法的執(zhí)行效率進(jìn)行考量的。
1.安全點(diǎn)
在可達(dá)性分析中對(duì)執(zhí)行的時(shí)間的敏感體現(xiàn)在GC停頓上,其意思是在整個(gè)分析的過(guò)程中看起來(lái)就像被凍結(jié)在某一個(gè)時(shí)間點(diǎn)上的,不可以出現(xiàn)分析的過(guò)程中引用關(guān)系在不斷變化,如果這點(diǎn)得不到保證則分析的結(jié)果的準(zhǔn)確性就得不到保障。這點(diǎn)是導(dǎo)致在GC進(jìn)行時(shí)需要停頓所有的Java執(zhí)行線程。
當(dāng)執(zhí)行系統(tǒng)停頓下來(lái)后,虛擬機(jī)并不需要全部上下文和全局所有的位置,虛擬機(jī)通過(guò)一個(gè)OopMap的數(shù)據(jù)結(jié)構(gòu)在類加載的時(shí)候?qū)?duì)象的偏移量數(shù)據(jù)信息記錄下來(lái),所以GC掃描是直接得到這些信息的。其實(shí)這些通過(guò)指令被加入進(jìn)行記載對(duì)象信息的OopMap位置也叫做安全點(diǎn),程序執(zhí)行時(shí)并非所有點(diǎn)都可以停下來(lái)開始GC的,只有在到達(dá)安全點(diǎn)才能停頓。安全點(diǎn)機(jī)制程序執(zhí)行中,在不太長(zhǎng)的時(shí)間內(nèi)會(huì)遇到可進(jìn)入GC的安全點(diǎn)。在實(shí)際中會(huì)遇到在GC時(shí)有線程不再執(zhí)行,例如線程被掛起了。這是我們需要安全區(qū)域去解決。
2.安全區(qū)域
安全區(qū)域是指在一段代碼片段中,引用關(guān)系不會(huì)發(fā)生變化。在這個(gè)區(qū)域中的任意地方開始GC都是安全的。在代碼執(zhí)行到安全區(qū)域時(shí),首先表示這直接進(jìn)去安全區(qū)域,這樣虛擬機(jī)在這段時(shí)間GC時(shí)就不用管那些標(biāo)記為安全區(qū)域的線程了。當(dāng)離開安全區(qū)域時(shí)首先得判斷GC分析是否完成,沒完成則需要等待。
五.理解GC日志
這是上圖打印的GC日志
[GC (System.gc()) [PSYoungGen: 6092K->448K(38400K)] 6092K->456K(125952K), 0.0051702 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
其中,PSYoungGen表示的是新生代GC不同垃圾收集器新生代名稱不一樣,6092K->448K(38400K)表示新生代大小的變化,6092K->456K(125952K)表示堆內(nèi)存的大小變化,后面表示用時(shí)。
[Full GC (System.gc()) [PSYoungGen: 448K->0K(38400K)] [ParOldGen: 8K->378K(87552K)] 456K->378K(125952K), [Metaspace: 3050K->3050K(1056768K)], 0.0056045 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
這里表示發(fā)生在老年代的GC(Major GC/Full GC) 它只是為伴隨一次的新生代的GC(Minor GC),448K->0K(38400K)表示新生代內(nèi)存變化,8K->378K(87552K) 表示老年代GC變化,456K->378K(125952K)表示GC前后堆內(nèi)存的變化。
【本文是專欄機(jī)構(gòu)“AiChinaTech”的原創(chuàng)文章,微信公眾號(hào)( id: tech-AI)”】
戳這里,看該作者更多好文
網(wǎng)頁(yè)名稱:Java中GC原理及GC日志剖析
轉(zhuǎn)載來(lái)源:http://m.fisionsoft.com.cn/article/dpgcpid.html


咨詢
建站咨詢
