JVM程序员java进阶干货

垃圾收集器与内存分配策略(一)

2017-04-05  本文已影响53人  zlcook

1. JVM运行时各个数据区域的内存分配和回收概况

1.1程序计数器、虚拟机栈、本地方法区

1.2堆和方法区

2. 垃圾收集器


2.1 对象存活判定算法(哪些内存需要回收?)

2.1.1 引用计数算法(Reference Counting)

/**
 * testGC()方法执行后,objA和objB会不会被GC呢? 
 * @author zzm
 */
public class ReferenceCountingGC {

    public Object instance = null;

    private static final int _1MB = 1024 * 1024;

    /**
     * 这个成员属性的唯一意义就是占点内存,以便在能在GC日志中看清楚是否有回收过
     */
    private byte[] bigSize = new byte[2 * _1MB];

    public static void testGC() {
        ReferenceCountingGC objA = new ReferenceCountingGC();
        ReferenceCountingGC objB = new ReferenceCountingGC();
        objA.instance = objB;
        objB.instance = objA;

        objA = null;
        objB = null;

        // 假设在这行发生GC,objA和objB是否能被回收?
        System.gc();
    }
}

2.1.2 可达性分析算法(Reachability Analysis)

2.2 对象什么时候回收(什么时候回收?)

2.2.1 引用

2.2.2生存还是死亡


堆内存回收

2.3垃圾收集算法(如何回收?)

2.3.1标记-清除算法

2.3.2复制算法

2.3.3改进的复制算法

2.3.4 标记-整理算法

标记-整理算法示意图

2.3.5分代收集算法(*)


3.方法区内存回收

3.1概述

3.2常量回收

3.2.1方法区中常量类型

3.2.2回收过程

3.3 无用的类回收

总结

上一篇 下一篇

猜你喜欢

热点阅读