6.劍指JavaOffer-內(nèi)存回收

對(duì)象被判定為垃圾的標(biāo)準(zhǔn):沒(méi)有被其他對(duì)象引用
用引用計(jì)數(shù)法和可達(dá)性分析算法判斷是否為垃圾:


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

優(yōu)缺點(diǎn)

例如

image.png

image.png

不可達(dá)的對(duì)象都回收,非綠色的
第一種,標(biāo)記清除


image.png

image.png

缺點(diǎn):內(nèi)存碎片,內(nèi)存不連續(xù)
第二種標(biāo)記復(fù)制
image.png

用來(lái)回收年輕代:
image.png

第三種標(biāo)記整理
image.png
image.png

第四種分代收集
image.png

image.png

舉例:
image.png

初始狀態(tài)是這樣,綠色代表存活,把這個(gè)0放入S0中,并加1清空Eden,然后
image.png

Eden又滿了, s0中的1加1放入s1,Eden同理,之后清空Eden和s0(所以使用的是標(biāo)記復(fù)制算法)

Minor GC:從年輕代空間(包括 Eden 和 Survivor 區(qū)域)回收內(nèi)存被稱為 Minor GC
Major GC 是清理老年代。
Full GC 是清理整個(gè)堆空間—包括年輕代和老年代。
何時(shí)晉升老年代?


image.png
image.png

老年代一般使用標(biāo)記整理或者標(biāo)記清除

image.png

image.png

image.png

分析節(jié)點(diǎn)必須具備確定性,引用關(guān)系不能再變化了
年輕代的垃圾收集器:


image.png

簡(jiǎn)單高效,通常client用
image.png

通常多核cpu,server用


image.png

老年代的垃圾收集器:
image.png

image.png

image.png

G1收集器新老代都可以


image.png

image.png

GC的相關(guān)面試題:


image.png

如何自救:

import java.lang.ref.ReferenceQueue;

public class Finalization {
    public static Finalization finalization;
    @Override
    protected void finalize(){
        System.out.println("Finalized");
        finalization = this;
    }

    public static void main(String[] args) {
        Finalization f = new Finalization();
        System.out.println("First print: " + f);
        f = null;
        System.gc();
        try {// 休息一段時(shí)間,讓上面的垃圾回收線程執(zhí)行完成
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("Second print: " + f);
        System.out.println(f.finalization);
    }
}

強(qiáng)引用、軟引用、弱引用、虛引用


強(qiáng)引用
image.png
image.png

image.png

image.png

引用隊(duì)列的作用:存強(qiáng)引用之外的與之關(guān)聯(lián)的對(duì)象


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 通過(guò)這篇文章你能知道的問(wèn)題: 1.如何判斷對(duì)象是活著還是死去? 2.在Java語(yǔ)言中,可作為GCRoots的對(duì)象有...
    beneke閱讀 1,429評(píng)論 0 1
  • Java和C++之間有一堵由內(nèi)存動(dòng)態(tài)分配和垃圾收集技術(shù)所圍成的“高墻”,墻外面的人想進(jìn)來(lái),墻里面的人想出來(lái)。 對(duì)象...
    胡二囧閱讀 1,329評(píng)論 0 4
  • 本節(jié)常見(jiàn)面試題: 問(wèn)題答案在文中都有提到 如何判斷對(duì)象是否死亡(兩種方法)。 簡(jiǎn)單的介紹一下強(qiáng)引用、軟引用、弱引用...
    Java黎先生閱讀 302評(píng)論 0 4
  • 寫在前面 本節(jié)常見(jiàn)面試題: 問(wèn)題答案在文中都有提到 如何判斷對(duì)象是否死亡(兩種方法)。 簡(jiǎn)單的介紹一下強(qiáng)引用、軟引...
    哈哈大圣閱讀 234評(píng)論 0 1
  • 看了《年少不懂李宗盛,懂時(shí)已不再少年》一文,立時(shí)悲從中來(lái),因?yàn)?,我雖不懂李宗盛,但也已覺(jué)不少年。 昨晚,和老張、王...
    弟哥閱讀 284評(píng)論 0 0

友情鏈接更多精彩內(nèi)容