JAVA虛擬機(jī)筆記- 垃圾收集器
1.JAVA虛擬機(jī)中程序計(jì)數(shù)器陪腌,虛擬機(jī)棧畜埋,本地方法3各區(qū)域會(huì)隨著線程的結(jié)束而被回收莫绣,線程的創(chuàng)建而創(chuàng)建,因此這幾區(qū)域不用考慮垃圾回收悠鞍,需要考慮的是JAVA堆和方法區(qū).
2.引用計(jì)數(shù)算法
在對(duì)象頭信息中添加增加計(jì)數(shù)器对室,如果當(dāng)前對(duì)象被引用就計(jì)數(shù)+1,引用失效就-1,計(jì)數(shù)器為0就代表當(dāng)前對(duì)象沒有被使用,有個(gè)問題就是對(duì)象之間相互應(yīng)用的問題狞玛,有可能導(dǎo)致無法回收软驰,缺點(diǎn)是
1.每次垃圾回收都會(huì)暫停當(dāng)前的線程
2.垃圾回收器需要間隔性檢查,并且清除的過程相對(duì)較慢心肪。
3.在標(biāo)記之后锭亏,會(huì)產(chǎn)生大量的內(nèi)存碎片,導(dǎo)致分配大空間對(duì)象的時(shí)候硬鞍,由于找不到足夠大的內(nèi)存慧瘤,而在一次GC
3.可達(dá)性分析算法
通過一系列的稱為“GC ROOTS”的對(duì)象作為起點(diǎn)線,從這些節(jié)點(diǎn)往下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain)固该,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí)锅减,則證明此對(duì)象是不可用的,下圖對(duì)象object5, object6, object7雖然有互相判斷伐坏,但它們到GC Roots是不可達(dá)的怔匣,所以它們將會(huì)判定為是可回收對(duì)象。
在Java語言里桦沉,可作為GC Roots對(duì)象的包括如下幾種:
a.虛擬機(jī)棧(棧楨中的本地變量表)中的引用的對(duì)象
b.方法區(qū)中的類靜態(tài)屬性引用的對(duì)象
c.方法區(qū)中的常量引用的對(duì)象
d.本地方法棧中JNI的引用的對(duì)象
4.引用
1.在JDK1.2之前每瞒,JAVA中定義引用就是Reference類型的數(shù)據(jù)中存儲(chǔ)的數(shù)值代表的是另一塊的內(nèi)存的起始值就代表,這塊內(nèi)存帶有一個(gè)引用
2.在JAVA1.2之后對(duì)應(yīng)用又進(jìn)行的分配纯露,分為強(qiáng)引用剿骨,軟引用,弱引用埠褪,虛引用這4種浓利。
2.1 強(qiáng)引用:就是new創(chuàng)建出來的對(duì)象,只要強(qiáng)引用還存在钞速,就永遠(yuǎn)不會(huì)回收贷掖。
2.2 軟應(yīng)用:(sof)在內(nèi)存不足的時(shí)候,會(huì)把這類對(duì)象放到準(zhǔn)備GC的范圍之內(nèi)
2.3 弱引用:(wr)只要當(dāng)垃圾回收器開始回收就會(huì)回收當(dāng)前對(duì)象玉工。
2.4 虛引用:(pr)最弱的一種應(yīng)用羽资,唯一的目的就是在垃圾回收的時(shí)候給個(gè)系統(tǒng)通知。
5.垃圾收集算法
5.1 標(biāo)記-清除算法遵班,就是標(biāo)出需要回收的對(duì)象屠升,然后銷毀的時(shí)候清楚標(biāo)記,由于標(biāo)記和清楚效率不是很高狭郑,而且清楚之后會(huì)形成較多的空白區(qū)域腹暖,產(chǎn)生大量的不連續(xù)的內(nèi)存碎片,導(dǎo)致程序在運(yùn)行的時(shí)候找不到分配一個(gè)足夠大的內(nèi)存區(qū)域翰萨,而導(dǎo)致再一次的GC
5.2 復(fù)制算法脏答,就是將一塊區(qū)域分為2部分,一部分空出來亩鬼,當(dāng)一部分內(nèi)存不夠用了殖告,就把當(dāng)前部分存活對(duì)象復(fù)制到另一半,然后清空另一半?yún)^(qū)域達(dá)到內(nèi)存回收雳锋,會(huì)造成內(nèi)存的浪費(fèi)黄绩。
5.3 標(biāo)記-整理算法,還是按照標(biāo)記清楚算法一樣玷过,但是后續(xù)步揍不是直接回收爽丹,而是讓所有的存貨對(duì)象都像一端移動(dòng),然后清理掉端邊界以外的部分辛蚊。
5.4 分代收集算法粤蝎,當(dāng)前基,本商用的虛擬機(jī)都是采用此種算法袋马,此種算法的思路是初澎,根據(jù)對(duì)象的存活周期不同分為幾塊,一般是把java堆分為新生代和老年代虑凛,在新生代中碑宴,每次垃圾回收時(shí)都有大量對(duì)象死去,就用復(fù)制算法卧檐,而老年代對(duì)象存活效率高墓懂,沒有額外空間給分配,就必須使用‘標(biāo)記清理霉囚,或者標(biāo)記整理’算法來清理捕仔。
5.5 分代收集:
虛擬機(jī)給每個(gè)對(duì)象定義了一個(gè)對(duì)象年齡的計(jì)數(shù)器,如果對(duì)象在出生經(jīng)過一次的Minor GC之后仍然存活盈罐,會(huì)被移動(dòng)到Survuvor區(qū)中榜跌,每經(jīng)過一次 Minor Gc之后并且能夠存活下來,就年齡+1盅粪,當(dāng)年齡增加到15歲的時(shí)候钓葫,就會(huì)被晉升到老年代中去,這個(gè)老年代的閾值是可以設(shè)置的票顾。如果Survuvor區(qū)中相同年齡的對(duì)象大小之后大于或者等于Survuvor區(qū)內(nèi)存的一半础浮,不用等到15歲帆调,直接大于或者等于改年齡段直接進(jìn)入老年區(qū)。