美文网首页
GC 垃圾回收(Java)

GC 垃圾回收(Java)

作者: 雁度寒崖 | 来源:发表于2019-10-10 08:52 被阅读0次

    对象被判断为垃圾的标准

    引用计数算法(基本不用)

    1.通过判断对象引用的数量决定对象是否被回收
    2.每个对象都有一个引用计数器,被引用+1,引用完-1(变量被赋予新值,或含参方法调用完毕)
    3.引用计数为0的对象就可以被回收了。
    优点:执行效率高,程序执行受影响较小。
    缺点:无法检测出循环引用,导致内存泄漏。

    可达性分析算法()

    通过判断对象的引用链是否可达来决定对象是否可以被回收(图论)
    可以作为GC Root的对象
    1.栈中引用的对象(栈帧中的本地变量表)new了一个Object赋值给一个局部变量 Object就是Root
    2.方法区中常量引用的对象
    3.方法区中的类静态属性引用的对象
    4.本地方法栈JNI以及Native的引用的对象
    5.活跃的现成的对象

    垃圾回收算法

    标记清楚算法

    标记:从根基和进行扫描,对存活的对象进行标记
    清除:堆堆内存从头到尾进行线性遍历,回收不可达对象内存
    会产生很多不连续的内存碎片
    viewter出入暂停状态,collector处于尝试垃圾收集,直到OutOfMemoryError错误

    复制算法

    分为对象面和空闲面
    对象在对象面上创建
    存活的对象被从对象面复制到空闲面
    将对象面所有对象内存清除
    特点:
    1.解决碎片化问题
    2.顺序分配内存,简单高效
    3.适用于对象存活率低的场景

    标记整理算法

    标记:从根集合进行扫描,对存活的对象进行标记
    清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收
    特点:
    1.避免内存不连续性
    2.不用设置两块内存互换
    3.适用于存活率高的场景

    分代收集算法

    按照对象生命周期的不同划分区域采用不同的垃圾回收算法
    目的:提高JVM回收效率
    JDK8及以后的版本
    只有年轻代和老年代
    年轻代几乎是所有Java对象出生的地方(Java申请的内存,存放都在这里,(Java对象通常不需要长久存活))
    年轻代存活率低(复制算法)
    老年代存活率高(标记清除算法,标记整理算法)

    GC分类

    Minor GC(发生在年轻代中,复制算法)
    Eden(伊甸)区:对象刚被创建的时候,首先放在这个区,放不下再考虑老年代或者Survivor区
    两个Survivor区(from和to):
    Full GC()
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1

    相关文章

      网友评论

          本文标题:GC 垃圾回收(Java)

          本文链接:https://www.haomeiwen.com/subject/rmguyctx.html