您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么使用Java垃圾回收算法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么使用Java垃圾回收算法”吧!
引用計(jì)數(shù)法:在Java中,引用和對(duì)象是有關(guān)聯(lián)的。如果要操作對(duì)象則必須用引用進(jìn)行。因此,很顯然一個(gè)簡(jiǎn)單的辦法是通過(guò)引用計(jì)數(shù)來(lái)判斷一個(gè)對(duì)象是否可以回收。簡(jiǎn)單說(shuō),即一個(gè)對(duì)象如果沒(méi)有任何與之關(guān)聯(lián)的引用,即他們的引用計(jì)數(shù)都不為0,則說(shuō)明對(duì)象不太可能再被用到,那么這個(gè)對(duì)象就是可回收對(duì)象。
可達(dá)性分析:為了解決引用計(jì)數(shù)法的循環(huán)引用問(wèn)題,Java使用了可達(dá)性分析的方法。通過(guò)一系列“GC roots”對(duì)象作為起點(diǎn)搜索。如果在“GC roots”和一個(gè)對(duì)象之間沒(méi)有可達(dá)路徑,則稱(chēng)該對(duì)象是不可達(dá)的。要注意的是,不可達(dá)對(duì)象不等價(jià)于可回收對(duì)象,不可達(dá)對(duì)象變?yōu)榭苫厥諏?duì)象至少要經(jīng)過(guò)兩次標(biāo)記過(guò)程。兩次標(biāo)記后仍然是可回收對(duì)象,則將面臨回收。
垃圾回收算法
標(biāo)記清除算法(Mark-Sweep)最基礎(chǔ)的垃圾回收算法,分為兩個(gè)階段,標(biāo)注和清除。標(biāo)記階段標(biāo)記出所有需要回收的對(duì)象,清除階段回收被標(biāo)記的對(duì)象所占用的空間。該算法最大的問(wèn)題是內(nèi)存碎片化嚴(yán)重,后續(xù)可能發(fā)生大對(duì)象不能找到可利用空間的問(wèn)題。
復(fù)制算法(copying)為了解決Mark-Sweep 算法內(nèi)存碎片化的缺陷而被提出的算法。按內(nèi)存容量將內(nèi)存劃分為等大小的兩塊。每次只使用其中一塊,當(dāng)這一塊內(nèi)存滿(mǎn)后將尚存活的對(duì)象復(fù)制到另一塊上去,把已使用的內(nèi)存清掉。這種算法雖然實(shí)現(xiàn)簡(jiǎn)單,內(nèi)存效率高,不易產(chǎn)生碎片,但是最大的問(wèn)題是可用內(nèi)存被壓縮到了原本的一半。且存活對(duì)象增多的話,Copying 算法的效率會(huì)大大降低。
分代收集算法分代收集法是目前大部分JVM所采用的方法,其核心思想是根據(jù)對(duì)象存活的不同生命周期將內(nèi)存劃分為不同的域,一般情況下將GC堆劃分為老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特點(diǎn)是每次垃圾回收時(shí)只有少量對(duì)象需要被回收,新生代的特點(diǎn)是每次垃圾回收時(shí)都有大量垃圾需要被回收,因此可以根據(jù)不同區(qū)域選擇不同的算法。
新生代與復(fù)制算法
目前大部分JVM的GC對(duì)于新生代都采取Copying算法,因?yàn)樾律忻看卫厥斩家厥沾蟛糠謱?duì)象,即要復(fù)制的操作比較少,但通常并不是按照1:1來(lái)劃分新生代。一般將新生代劃分為一塊較大的Eden空間和兩個(gè)較小的Survivor空間(From Space, To Space),每次使用Eden空間和其中的一塊Survivor空間,當(dāng)進(jìn)行回收時(shí),將該兩塊空間中還存活的對(duì)象復(fù)制到另一塊Survivor空間中。
老年代與標(biāo)記復(fù)制算法
老年代因?yàn)槊看沃换厥丈倭繉?duì)象,因而采用Mark-Compact算法。
(1)Java虛擬機(jī)提到過(guò)的處于方法區(qū)的永生代(Permanet Generation),它用來(lái)存儲(chǔ)class類(lèi),常量,方法描述等。對(duì)永生代的回收主要包括廢棄常量和無(wú)用的類(lèi)。
(2)對(duì)象的內(nèi)存分配主要在新生代的Eden Space和Survivor Space的From Space(Survivor 目前存放對(duì)象的那一塊),少數(shù)情況會(huì)直接分配到老生代。
(3)當(dāng)新生代的Eden Space和 From Space空間不足時(shí)就會(huì)發(fā)生一次GC,進(jìn)行GC后,Eden Space和From Space區(qū)的存活對(duì)象會(huì)被挪到To Space,然后將Eden Space和From Space進(jìn)行清理。
(4)如果To Space無(wú)法足夠存儲(chǔ)某個(gè)對(duì)象,則將這個(gè)對(duì)象存儲(chǔ)到老生代。
(5)在進(jìn)行GC后,使用的便是Eden Space和To Space了,如此反復(fù)循環(huán)。
(6)當(dāng)對(duì)象在Survivor區(qū)躲過(guò)一次GC后,其年齡就會(huì)+1。默認(rèn)情況下年齡到達(dá)15的對(duì)象會(huì)被移到老生代中。
到此,相信大家對(duì)“怎么使用Java垃圾回收算法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(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)容。