JVM系列1 内存结构和垃圾回收

2018-08-07  本文已影响0人  莫小归

参考:
Java内存模型:https://www.jianshu.com/p/cc640f7e919b
GC收集器:https://www.jianshu.com/p/50d5c88b272d
Java垃圾回收:https://www.jianshu.com/p/424e12b3a08f
Java垃圾回收算法和垃圾收集器:https://www.jianshu.com/p/6dd6ac40b58e

一.内存结构

1.JVM内存
JVM内存结构布局

JVM内存组成:堆内存(Heap) + 方法区(Method Area) + 栈(Thread 1..N)

2.JVM内存区域控制
JVM内存区域控制参数

3.JVM运行时内存

JVM运行时内存

堆和方法区线程共享,具体信息见上文;
栈 = Java栈 + 本地方法栈 + 程序计数器,线程私有

4.注意事项

二、垃圾收集

1.垃圾收集内存(回收哪里?)
堆内存
2.垃圾对象判定(回收哪些?)
可达性算法
public class FinalizeEscapeGC {
    public static FinalizeEscapeGC SAVE_HOOK = null;
    public void isAlive() {
        System.out.println("yes, i am still alive :)");
    }
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize mehtod executed!");
        FinalizeEscapeGC.SAVE_HOOK = this;
    }
    public static void main(String[] args) throws Throwable {
        SAVE_HOOK = new FinalizeEscapeGC();
        //对象第一次成功拯救自己
        SAVE_HOOK = null;
        System.gc();
        // 因为Finalizer方法优先级很低,暂停0.5秒,以等待它
        Thread.sleep(500);
        if (SAVE_HOOK != null) {
            SAVE_HOOK.isAlive();
        } else {
            System.out.println("no, i am dead :(");
        }
        // 下面这段代码与上面的完全相同,但是这次自救却失败了
        SAVE_HOOK = null;
        System.gc();
        // 因为Finalizer方法优先级很低,暂停0.5秒,以等待它
        Thread.sleep(500);
        if (SAVE_HOOK != null) {
            SAVE_HOOK.isAlive();
        } else {
            System.out.println("no, i am dead :(");
        }
    }
}
3.垃圾回收(如何收)
4.其他

三.解释执行和编译执行

1.解释执行
2.编译执行
3.Java的执行

海日生残夜,江春入旧年

上一篇 下一篇

猜你喜欢

热点阅读