您好,登錄后才能下訂單哦!
java中怎么實(shí)現(xiàn)垃圾收集器,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
1.1 引用計(jì)數(shù)算法:給對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器值就加1;當(dāng)引用失效時(shí),計(jì)數(shù)器值就減1;任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是不可能再被使用的。 缺點(diǎn):對(duì)象之間相互循環(huán)引用
1.2 可達(dá)性分析算法:通過一系列的稱為“GC Roots”的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連(用圖論的話來說,就是從GC Roots到這個(gè)對(duì)象不可達(dá))時(shí),則證明此對(duì)象是不可用的 GC Roots的對(duì)象包括下面幾種:
1. 虛擬機(jī)棧(棧幀中的本地變量表)中引用的對(duì)象 2. 方法區(qū)中類靜態(tài)屬性引用的對(duì)象 3. 方法區(qū)中常量引用的對(duì)象 4. 本地方法棧中JNI(即一般說的Native方法)引用的對(duì)象
強(qiáng)引用:程序代碼之中普遍存在的,類似“Object obj = new Object()”這類的引用,只要強(qiáng)引用還存在,垃圾收集器永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象,直到拋出OutOfMemeryError異常。
軟引用:用來描述一些還有用但并非必需的對(duì)象。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會(huì)把這些對(duì)象列進(jìn)回收范圍之中進(jìn)行第二次回收。如果這次回收還沒有足夠的內(nèi)存,才會(huì)拋出內(nèi)存溢出異常。
弱引用:用來描述非必需對(duì)象的,但是它的強(qiáng)度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對(duì)象只能生存到下一次垃圾收集發(fā)生之前。當(dāng)垃圾收集器工作時(shí),無論當(dāng)前內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象。
虛引用:也稱為幽靈引用或者幻影引用,它是最弱的一種引用關(guān)系。一個(gè)對(duì)象是否有虛引用的存在,完全不會(huì)對(duì)其生存時(shí)間構(gòu)成影響,也無法通過虛引用來取得一個(gè)對(duì)象實(shí)例。為一個(gè)對(duì)象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個(gè)對(duì)象被收集器回收時(shí)收到一個(gè)系統(tǒng)通知。
包含一下:
- 新生代:Serial、ParNew、Parallel Scavenge - 老年代:Serial Old、Parallel Old、CMS、G1
Serial收集器:Serial收集器是最基本、發(fā)展歷史最悠久的收集器,簡(jiǎn)單而高效。因?yàn)槭菃尉€程收集,在工作期間會(huì)“Stop The World!”。Serial收集器對(duì)于運(yùn)行在Client模式下的虛擬機(jī)來說是一個(gè)很好的選擇。
ParNew收集器:ParNew收集器其實(shí)就是Serial收集器的多線程版本。Serial收集器對(duì)于運(yùn)行在Server模式下的虛擬機(jī)來說是一個(gè)很好的選擇。
Parallel Scavenge:Parallel Scavenge收集器是一個(gè)新生代收集器,也是使用復(fù)制算法的收集器,又是并行的多線程收集器。Parallel Scavenge收集器的目標(biāo)則是達(dá)到一個(gè)可控制的吞吐量(Throughput)。所謂吞吐量就是CPU用于運(yùn)行用戶代碼的時(shí)間與CPU總消耗時(shí)間的比值,即吞吐量 = 運(yùn)行用戶代碼時(shí)間/(運(yùn)行用戶代碼時(shí)間 +垃圾收集時(shí)間),虛擬機(jī)總共運(yùn)行了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%。 停頓時(shí)間越短就越適合需要與用戶交互的程序,良好的響應(yīng)速度能提升用戶體驗(yàn),而高吞吐量則可以高效率地利用CPU時(shí)間,盡快完成程序的運(yùn)算任務(wù),主要適合在后臺(tái)運(yùn)算而不需要太多交互的任務(wù)。 無法與CMS收集器配合工作。
Serial Old收集器:是Serial收集器的老年代版本,它同樣是一個(gè)單線程收集器,使用“標(biāo)記-整理”算法。主要是給Client模式下的虛擬機(jī)使用。
Parallel Old收集器:Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標(biāo)記-整理”算法。
CMS收集器:CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,基于“標(biāo)記—清除”算法實(shí)現(xiàn)。 實(shí)現(xiàn)過程:
1. 初始標(biāo)記(CMS initial mark) 2. 并發(fā)標(biāo)記(CMS concurrent mark) 3. 重新標(biāo)記(CMS remark) 4. 并發(fā)清除(CMS concurrent sweep)
初始標(biāo)記、重新標(biāo)記這兩個(gè)步驟仍然需要“Stop The World”。 初始標(biāo)記只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,速度很快。 并發(fā)標(biāo)記階段就是進(jìn)行GC Roots Tracing的過程。 重新標(biāo)記階段則是為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間一般會(huì)比初始標(biāo)記階段稍長(zhǎng)一些,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短。
三個(gè)缺點(diǎn):
CMS收集器對(duì)CPU資源非常敏感
無法處理浮動(dòng)垃圾(Floating Garbage),可能出現(xiàn)“Concurrent Mode Failure”失敗而導(dǎo)致另一次Full GC的產(chǎn)生
空間碎片過多時(shí),將會(huì)給大對(duì)象分配帶來很大麻煩,往往會(huì)出現(xiàn)老年代還有很大空間剩余,但是無法找到足夠大的連續(xù)空間來分配當(dāng)前對(duì)象,不得不提前觸發(fā)一次Full GC
G1收集器:它是一款面向服務(wù)端應(yīng)用的垃圾收集器。 具備以下特點(diǎn):
并行與并發(fā)
分代收集
空間整合
可預(yù)測(cè)的停頓
G1收集器的運(yùn)作大致可劃分為以下幾個(gè)步驟:
初始標(biāo)記(Initial Marking)
并發(fā)標(biāo)記(Concurrent Marking)
最終標(biāo)記(Final Marking)
篩選回收(Live Data Counting and Evacuation)
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。