Java垃圾回收

一、判断哪些对象已死

    1.引用计数算法(引用计数器)

    2.可达性分析算法

        GC Root是否可达(引用链)

        不可达不一定判定为死亡,至少被标记两次。

        最后被判断为有必要执行finalize()的对象放到F-Queue队列里,其中会进行第二次小规模的标记,是其中的对象最后拯  救自己的机会。

二、垃圾收集算法

    1.标记清除法

        标记和清除的效率不高

        会产生内存碎片

    2、复制算法

        将内存缩小为原来的一般,内存代价高。

        在新生代,常常将内存按8:1的比例分为Eden,和survivor

    3.标记-整理算法

    4.分代收集算法

        针对不同的存活周期的对象,分为新生代和老年代,而执行不同的算法

三、HotSpot的算法实现

    1.枚举根节点

        从GC Root节点找引用链,会有GC停顿

        在类加载完的时候就会把类中对象的信息储存在OopMap中

        每到达一个安全点就会更新一次OopMap

        安全区域为了解决线程子啊sleep或者Block状态时的GC进入问题

四、垃圾收集器:

1.Serial收集器

    最基本的收集器。

    单线程

    stop the word

2 ParNew

    serial收集器的的多线程版本

    运行在Server模式

    单CPU不如Serial

3 Parallel Scavenge

    新生代收集器

    使用复制算法

    吞吐量优先的收集器

4 Serial Old

    Serial收集器的老版本

    使用标记整理算法

5 Parllel Old收集器 

    Parallel Scavenge的老版本

    多线程

6 CMS 收集器

    以最短停顿时间目标

    标记清除算法

    4个步骤:

            初始标记:stop the word 只是标记GC Root能直接关联的对象

            并发标记:执行GC Root Tracing

            重新标记: 修正并发标记之间的改动

            并发清除:并发标记和并发清除占时最长 ,但是可以与用户线程一起工作 

    优点:并发手机,低停顿

7 G1收集器

    最前沿的成果

    并行并发

    分代收集

    空间整合(整体为标记整理算法,局部为复制算法)

    可预测的停顿

    4个步骤:

            初始标记

            并发标记

            最终标记

            筛选回收

五、jvm中的新生代Eden和survivor区

    HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

六、大对象直接进入老年代

七、长期存活的对象进入老年代

       有一个Age计数器,每经历一次Minor GC就会增加1

       Eden区满时就会执行一次Minor GC


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值