6.剑指JavaOffer-内存回收

对象被判定为垃圾的标准:没有被其他对象引用
用引用计数法和可达性分析算法判断是否为垃圾:


引用计数法

优缺点

例如

image.png

image.png

不可达的对象都回收,非绿色的
第一种,标记清除


image.png

image.png

缺点:内存碎片,内存不连续
第二种标记复制
image.png

用来回收年轻代:
image.png

第三种标记整理
image.png
image.png

第四种分代收集
image.png

image.png

举例:
image.png

初始状态是这样,绿色代表存活,把这个0放入S0中,并加1清空Eden,然后
image.png

Eden又满了, s0中的1加1放入s1,Eden同理,之后清空Eden和s0(所以使用的是标记复制算法)

Minor GC:从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC
Major GC 是清理老年代。
Full GC 是清理整个堆空间—包括年轻代和老年代。
何时晋升老年代?


image.png
image.png

老年代一般使用标记整理或者标记清除

image.png

image.png

image.png

分析节点必须具备确定性,引用关系不能再变化了
年轻代的垃圾收集器:


image.png

简单高效,通常client用
image.png

通常多核cpu,server用


image.png

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

image.png

image.png

G1收集器新老代都可以


image.png

image.png

GC的相关面试题:


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 {// 休息一段时间,让上面的垃圾回收线程执行完成
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("Second print: " + f);
        System.out.println(f.finalization);
    }
}

强引用、软引用、弱引用、虚引用


强引用
image.png
image.png

image.png

image.png

引用队列的作用:存强引用之外的与之关联的对象


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容