日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java 垃圾回收總結(jié)(1)

 小豬窩969 2015-09-09

以前看過很多次關(guān)于垃圾回收相關(guān)的文章,都只是看過就忘記了,沒有好好的整理一下,發(fā)現(xiàn)寫文章可以強(qiáng)化自己的記憶。


 


java與C,c++有很大的不同就是java語言開發(fā)者不需要關(guān)注內(nèi)存信息,不會(huì)顯式的直接操作內(nèi)存,而是通過jvm虛擬機(jī)來實(shí)現(xiàn)。


java虛擬機(jī)運(yùn)行的時(shí)候內(nèi)存分配圖如下圖:


1


 


jvm虛擬機(jī)棧:一個(gè)是線程獨(dú)有的,每次啟動(dòng)一個(gè)線程,就創(chuàng)建一個(gè)jvm虛擬機(jī)棧,線程退出的時(shí)候就銷毀。這里面主要保存線程本地變量名和局部變量值。


本地方法棧: 調(diào)用本地jni方法的時(shí)候而創(chuàng)建的。這里分配的jvm之外的內(nèi)存空間。方法調(diào)用結(jié)束之后銷毀。


pc寄存器 : 這個(gè)保存線程當(dāng)前執(zhí)行的字節(jié)碼指令


堆:主要保存創(chuàng)建的對(duì)象。


方法區(qū):保存class相關(guān)的信息。主要是class的一個(gè)內(nèi)存結(jié)構(gòu)信息


常量池:方法區(qū)的一部分,主要保存class內(nèi)存結(jié)構(gòu)中常量值 例如String值,public static final 類型的值


 


我們這里說的垃圾回收,主要是java虛擬機(jī)對(duì)堆內(nèi)存區(qū)域的回收。


 


1 首先的問題是:jvm如何知道那些對(duì)象需要回收 ?


目前有兩種算法



  • 引用計(jì)數(shù)法



每個(gè)對(duì)象上都有一個(gè)引用計(jì)數(shù),對(duì)象每被引用一次,引用計(jì)數(shù)器就+1,對(duì)象引用被釋放,引用計(jì)數(shù)器-1,直到對(duì)象的引用計(jì)數(shù)為0,對(duì)象就標(biāo)識(shí)可以回收


這個(gè)可以用數(shù)據(jù)算法中的圖形表示,對(duì)象A-對(duì)象B-對(duì)象C 都有引用,所以不會(huì)被回收,對(duì)象B由于沒有被引用,沒有路徑可以達(dá)到對(duì)象B,對(duì)象B的引用計(jì)數(shù)就就是0,對(duì)象B就會(huì)被回收。


 


 2




但是這個(gè)算法有明顯的缺陷,對(duì)于循環(huán)引用的情況下,循環(huán)引用的對(duì)象就不會(huì)被回收。例如下圖:對(duì)象A,對(duì)象B 循環(huán)引用,沒有其他的對(duì)象引用A和B,則A和B 都不會(huì)被回收。


 3




  • root搜索算法



這種算法目前定義了幾個(gè)root,也就是這幾個(gè)對(duì)象是jvm虛擬機(jī)不會(huì)被回收的對(duì)象,所以這些對(duì)象引用的對(duì)象都是在使用中的對(duì)象,這些對(duì)象未使用的對(duì)象就是即將要被回收的對(duì)象。簡單就是說:如果對(duì)象能夠達(dá)到root,就不會(huì)被回收,如果對(duì)象不能夠達(dá)到root,就會(huì)被回收。




如下圖:對(duì)象D訪問不到根對(duì)象,所以就會(huì)被回收


4




以下對(duì)象會(huì)被認(rèn)為是root對(duì)象:



  • 被啟動(dòng)類(bootstrap加載器)加載的類和創(chuàng)建的對(duì)象

  • jvm運(yùn)行時(shí)方法區(qū)類靜態(tài)變量(static)引用的對(duì)象

  • jvm運(yùn)行時(shí)方法去常量池引用的對(duì)象

  • jvm當(dāng)前運(yùn)行線程中的虛擬機(jī)棧變量表引用的對(duì)象

  • 本地方法棧中(jni)引用的對(duì)象




由于這種算法即使存在互相引用的對(duì)象,但如果這兩個(gè)對(duì)象無法訪問到根對(duì)象,還是會(huì)被回收。如下圖:對(duì)象C和對(duì)象D互相引用,但是由于無法訪問根,所以會(huì)被回收。


5




jvm在確定是否回收的對(duì)象的時(shí)候采用的是root搜索算法來實(shí)現(xiàn)。



在root搜索算法的里面,我們說的引用這里都指定的是強(qiáng)引用關(guān)系。所謂強(qiáng)引用關(guān)系,就是通過用new 方式創(chuàng)建的對(duì)象,并且顯示關(guān)聯(lián)的對(duì)象


1
Object obj = new Object();

以上就是代表的是強(qiáng)引用關(guān)系,變量obj 強(qiáng)引用了 Object的一個(gè)對(duì)象。


java里面有四種應(yīng)用關(guān)系,從強(qiáng)到弱分別為:


Strong Reference(強(qiáng)引用) –>Weak Reference (弱引用) -> Soft Reference(軟引用) – > Phantom Reference(引用)


 


Strong Reference : 只有在引用對(duì)象root不可達(dá)的情況下才會(huì)標(biāo)識(shí)為可回收,垃圾回收才可能進(jìn)行回收


Weak Reference :即使在root算法中 其引用的對(duì)象root可達(dá)到,但是如果jvm堆內(nèi)存 不夠的時(shí)候,還是會(huì)被回收。


Soft Reference : 無論其引用的對(duì)象是否root可達(dá),在響應(yīng)內(nèi)存需要時(shí),由垃圾回收判斷是否需要回收。


Phantom Reference :在回收器確定其指示對(duì)象可另外回收之后,被加入垃圾回收隊(duì)列.


 


下面可以看一個(gè)測(cè)試


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class ReferenceTest {
    public static final Map<Integer, Reference> map = new HashMap<Integer, Reference>();
    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            map.put(i, new WeakReference(new ReferenceObject(i)));
        }
        int i = 0;
        for (Reference r : map.values()) {
            if (r.get() == null) {
                i++;
            }
        }
        System.out.println("被回收的對(duì)象數(shù):" + i);
    }
    static class ReferenceObject {
        private int    i;
        private byte[] b;
        public ReferenceObject(int i) {
            this.i = i;
            b = new byte[1024 *10];
        }
    }
}

這里創(chuàng)建大約1000個(gè) 10K的 Weak Reference 對(duì)象,最后打印的結(jié)果是:被回收的對(duì)象數(shù):767,這里ReferenceObject如果設(shè)置為1K的話,最后的打印結(jié)果是0


這個(gè)例子并不嚴(yán)謹(jǐn),但是卻說明了被Weak Reference的對(duì)象在一定的時(shí)候會(huì)被jvm回收,但是強(qiáng)引用就不會(huì)出現(xiàn)這種狀態(tài)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多