? ? ? 說起java垃圾收集器大家估計都沒什么印象其實就是GC嘛唯袄,筆試GC題目被虐無數(shù)次岔绸,我沒看java虛擬機的時候我也不知道是怎么秦忿,在這里順便跟大家推薦一本書吧内颗,《深入理解java虛擬機》好啦廢話少說還是進入正題吧捻激。
一.GC介紹
? ? GC垃圾收集器是java虛擬機上實現(xiàn)內存回收技術的制轰,它跟c++的不一樣,c++沒創(chuàng)建一個對象都需要對生命周期結束的對象進行free處理來釋來放內存空間胞谭,而java內存回收機制更加靈活垃杖,它會自動回收內存的垃圾,讓開發(fā)者更關注業(yè)務流程丈屹。
二.GC對象存活判斷算法
GC在內存回收垃圾的時候调俘,會先判斷對象是否存活,還是掛掉了旺垒,并且回收掛掉的對象彩库。
在虛擬機中對象存活判斷方法主要有兩種:引用計數(shù)算法(不屬于jvm HotSpoot的方法)和可達性分析方法(屬于JVM的方法)。
引用計數(shù)算法:
引用計數(shù)算法的原理是這樣的:為對象設置一個計數(shù)器袖牙,當一個地方引用的時候就+1侧巨,當引用失效的時候就-1,當計數(shù)器的值為0的時候就開始回收內存空間鞭达。在這里是不是覺得它是一個很好的算法司忱,但是一般不會用在java虛擬機上皇忿,因為如果存在循環(huán)引用的話就會永遠釋放不了內存。下面舉個例子:
public classMyObject {
public Objectref=null;
public static void main(String[] args) {
MyObject myObject1 =newMyObject();
MyObject myObject2 =newMyObject();
myObject1.ref= myObject2;
myObject2.ref= myObject1;
myObject1 =null;
myObject2 =null;
}
}
在這個例子里面存在myObject1.ref= myObject2; myObject2.ref= myObject1;的相互引用坦仍,這樣計數(shù)器永遠不會為0.所以無法使用引用計數(shù)算法來進行回收這部分的內存鳍烁。
可達性分析算法:
可達性分析算法是根據(jù)“GCroot”的對象作為起點分析對象是否可用的,而根據(jù)這個結點往下搜索繁扎,搜索所走的路徑為引用鏈幔荒,如果不在這個鏈中的話(就是GCroot到這個對象是不可到達的話,那么證明這個對象是不可到達梳玫,可以進行回收)
根據(jù)上圖可以知道object5爹梁,6,7都是不可到達的提澎,那么判斷其為可回收對象姚垃,而在引用的過程,有一些引用對象存在意義不大盼忌,就好像是“食之無味积糯,棄之可惜”的對象,在內存使用比較緊張的時候可以進行回收谦纱,這里可以看一下關于引用類型(關于強引用看成,軟引用,弱引用跨嘉,虛引用)的文章地址為:http://blog.csdn.net/kuiyi3269/article/details/77284737