java

Java--垃圾回收机制(GC)

2019-04-23  本文已影响0人  二妹是只猫

垃圾的定义:

从前面我们已经知道GC主要是回收Java堆中的对象,即此对象已经没有了价值,就是变成了“垃圾”,那么对象被判定为垃圾的标准是什么呢?——没有被其他对象引用。

判定对象是否是垃圾的算法:

引用计数算法:主要是判断对象的引用数量。

优点:执行效率高,程序执行受影响较小
缺点:无法检测出循环引用的情况,导致无法回收垃圾,从而引发内存泄漏

可达性分析算法:通过判断对象的引用链遍历(从GC Root开始)是否可达来决定对象是否可以被回收。

可作为GC Root的对象:

回收垃圾的算法:

标记-清除算法(Mark and Sweep)
标记-清除算法(Mark and Sweep)
复制算法(Copying)
复制算法

优点:

不足:

适用场景:适用于对象存活率低的场景(年轻代)

标记-整理算法(Compacting)

升级版的标记-清除算法(Mark and Sweep)

标记-整理算法

优点:避免了内存的不连续行,防止出现大量内存碎片,不用浪费一半的内存(对比于复制算法)。

适用场景:适用于存活率高的场景(老年代)

标记分代收集算法(Generational Collector)

GC的分类

年轻代(Young Generation)

尽可能快速地收集掉那些生命周期短的对象

老年代(Old Generation):存放多次gc后存活的和一些比较大的对象
对象如何晋升到老年代
常用的调优参数
触发Full GC的条件

常见的垃圾收集器
不同虚拟机所提供的垃圾收集器可能会有很大差别,这里讨论的是HotSpot,HotSpot虚拟机所包含的所有收集器如图:

Stop-the-World

Safepoint

JVM的运行模式

GC相关面试

Object的finalize()方法的作用是否与C++的析构函数的作用相同?

代码实例:

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

输出:

First print: com.interview.javabasic.jvm.gc.Finalization@4554617c
Finalized
Second print: null
com.interview.javabasic.jvm.gc.Finalization@4554617c
Java中的强引用,软引用,弱引用,虚引用的作用?

强引用(Strong Reference)

软引用(Soft Reference)

String str = new String("abc"); //强引用
SoftReference softRef = new SoftReference(str); //软引用

弱引用(Weak Reference)

String str = new String("abc");
WeakReference weakRef = new WeakReference(str);

虚引用(PhantomReference)

String str = new String("abc");
ReferenceQueue queue = new ReferenceQueue();
PhantomReference ref = new PhantomReference(str, queue);

总结

引用类型 垃圾回收时间 用途 生存时间
强引用 从来不会 对象的一般状态 JVM停止运行时
软引用 在内存不足时 对象缓存 内存不足时终止
弱引用 在垃圾回收时 对象缓存 gc运行后终止
虚引用 Unknown 标记、哨兵 Unknown
上一篇下一篇

猜你喜欢

热点阅读