今天就跟大家聊聊有關(guān)Java虛擬機垃圾回收的實例分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到洪雅網(wǎng)站設(shè)計與洪雅網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、虛擬主機、企業(yè)郵箱。業(yè)務(wù)覆蓋洪雅地區(qū)。
-verbose:gc 打印垃圾回收簡單信息參數(shù)
-xx:+PringDCDetail 打印垃圾回收的詳細(xì)信息
引用計數(shù)算法很簡單,它實際上是通過在對象頭中分配一個空間來保存該對象被引用的次數(shù)。如果該對象被其它對象引用,則它的引用計數(shù)加一,如果刪除對該對象的引用,那么它的引用計數(shù)就減一,當(dāng)該對象的引用計數(shù)為0時,那么該對象就會被回收。
采用引用計數(shù)的垃圾收集機制中,垃圾收集的開銷被分?jǐn)偟秸麄€應(yīng)用程序的運行當(dāng)中了,而不是在進(jìn)行垃圾收集時,要掛起整個應(yīng)用的運行,直到對堆中所有對象的處理都結(jié)束。因此,采用引用計數(shù)的垃圾收集不屬于嚴(yán)格意義上的"Stop-The-World"的垃圾收集機制。
引用計數(shù)算法有一個比較大的問題,那就是它不能處理環(huán)形數(shù)據(jù),即如果有兩個對象相互引用,那么這兩個對象就不能被回收,因為它們的引用計數(shù)始終為1。這也就是我們常說的“內(nèi)存泄漏”問題。
Python中采用的是引用計數(shù)機制為主,標(biāo)記-清除和分代收集兩種機制為輔的策略。
為了引用計數(shù)算法中循環(huán)引用導(dǎo)致垃圾不會被回收的問題,在Java中采取了 可達(dá)性分析法。同樣采用此法的還有C#、Lisp(最早的一門采用動態(tài)內(nèi)存分配的語言)。該方法的基本思想是通過一系列的“GC Roots”對象作為起點進(jìn)行搜索,如果在“GC Roots”和一個對象之間沒有可達(dá)路徑,則稱該對象是不可達(dá)的,不過要注意的是被判定為不可達(dá)的對象不一定就會成為可回收對象。被判定為不可達(dá)的對象要成為可回收對象必須至少經(jīng)歷兩次標(biāo)記過程,如果在這兩次標(biāo)記過程中仍然沒有逃脫成為可回收對象的可能性,則基本上就真的成為可回收對象了。
GC Roots的對象
虛擬機棧(棧幀中的本地變量表)中引用的對象。(可以理解為:引用棧幀中的本地變量表的所有對象)
方法區(qū)中靜態(tài)屬性引用的對象(可以理解為:引用方法區(qū)該靜態(tài)屬性的所有對象)
方法區(qū)中常量引用的對象(可以理解為:引用方法區(qū)中常量的所有對象)
本地方法棧中(Native方法)引用的對象(可以理解為:引用Native方法的所有對象)
Java虛擬機將堆內(nèi)存劃分為新生代、老年代和永久代。

新生代(Young)
HotSpot將新生代劃分為三塊,一塊較大的Eden空間和兩塊較小的Survivor空間,默認(rèn)比例為8:1:1。劃分的目的是因為HotSpot采用復(fù)制算法來回收新生代,設(shè)置這個比例是為了充分利用內(nèi)存空間,減少浪費。新生成的對象在Eden區(qū)分配(大對象除外,大對象直接進(jìn)入老年代),當(dāng)Eden區(qū)沒有足夠的空間進(jìn)行分配時,虛擬機將發(fā)起一次Minor GC。
老年代(Old)
在新生代中經(jīng)歷了多次(具體看虛擬機配置的閥值)GC后仍然存活下來的對象會進(jìn)入老年代中。老年代中的對象生命周期較長,存活率比較高,在老年代中進(jìn)行GC的頻率相對而言較低,而且回收的速度也比較慢。
永久代(Permanent)
永久代存儲類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù),對這一區(qū)域而言,Java虛擬機規(guī)范指出可以不進(jìn)行垃圾收集,一般而言不會進(jìn)行垃圾回收。
算法分為“標(biāo)記”和“清除”兩個階段:首先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對象。
標(biāo)記-清除算法的主要缺點:
效率問題:標(biāo)記和清除過程的效率都不高;
空間問題:標(biāo)記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會導(dǎo)致,碎片過多會導(dǎo)致大對象無法分配到足夠的連續(xù)內(nèi)存,從而不得不提前觸發(fā)GC,甚至Stop The World。

為解決效率問題,“復(fù)制”收集算法出現(xiàn)了。它將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)這一塊的內(nèi)存用完了,就將還存活著的對象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。 這樣使得每次都是對其中的一塊進(jìn)行內(nèi)存回收,內(nèi)存分配時也就不用考慮內(nèi)存碎片等復(fù)雜情況,只要移動堆頂指針,按順序分配內(nèi)存即可,實現(xiàn)簡單,運行高效。 它的主要缺點有兩個:
效率問題:在對象存活率較高時,復(fù)制操作次數(shù)多,效率降低;
空間問題:內(nèi)存縮小了一半;需要使用老年代的額外空間做分配擔(dān)保。
From Survivor, To Survivor使用的就是復(fù)制算法。老年代不使用這種算法。

復(fù)制收集算法在對象存活率較高時就要執(zhí)行較多的復(fù)制操作,效率將會變低。更關(guān)鍵的是,如果不想浪費50%的空間,就需要有額外的空間進(jìn)行分配擔(dān)保,以應(yīng)對被使用的內(nèi)存中所有對象都100%存活的極端情況,所以在老年代一般不能直接選用這種算法。
根據(jù)老年代的特點,有人提出了另外一種“標(biāo)記-整理”(Mark-Compact)算法,標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象進(jìn)行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存。也稱為標(biāo)記-整理-清除算法。

GC分代的基本假設(shè):絕大部分對象的生命周期都非常短暫,存活時間短。 “分代收集”算法,把Java堆分為新生代和老年代,這樣就可以根據(jù)各個年代的特點采用最適當(dāng)?shù)氖占惴āT谛律校看卫占瘯r都發(fā)現(xiàn)有大批對象死去,只有少量存活,那就選用復(fù)制算法,只需要付出少量存活對象的復(fù)制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記-清理”或“標(biāo)記-整理”算法來進(jìn)行回收。
看完上述內(nèi)容,你們對Java虛擬機垃圾回收的實例分析有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
網(wǎng)頁題目:Java虛擬機垃圾回收的實例分析
當(dāng)前地址:http://www.chinadenli.net/article36/igpgsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、標(biāo)簽優(yōu)化、網(wǎng)站排名、手機網(wǎng)站建設(shè)、網(wǎng)站改版、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)