2020-07-14
Java培訓(xùn) Java教程
好程序員Java培訓(xùn)分享Java教程垃圾回收與算法,首先來(lái)講一下如何確定垃圾。
引用計(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ì)象增多的話(huà),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ì)被移到老生代中。
開(kāi)班時(shí)間:2021-04-12(深圳)
開(kāi)班盛況開(kāi)班時(shí)間:2021-05-17(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-03-22(杭州)
開(kāi)班盛況開(kāi)班時(shí)間:2021-04-26(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-05-10(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-02-22(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開(kāi)班時(shí)間:2020-09-21(上海)
開(kāi)班盛況開(kāi)班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開(kāi)班時(shí)間:2019-07-22(北京)
開(kāi)班盛況Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)