JVM GC简介

举报
南慧荣 发表于 2020/08/05 19:54:52 2020/08/05
【摘要】 JVM GC算法简介

1.GC策略

  • 引用计数法 引用计数没有归0永远不会被回收

  • 跟搜索算法 消除引用计数的弊端 设置若干跟对象当任何一个跟对象到一个对象不可达时, 认为该对象可以被回收跟对象:虚拟机栈的引用对象(本地变量表)方法区的静态属性引用的对象方法区的常量引用的对象(final)本地方法栈中JNI的引用对象(本地变量表)

2.垃圾回收算法

  • 标记清除算法:标记:遍历所有的GC ROOT, 将所有gc root 可达的对象标记为存活的对象清除:将所有没有标记的对象全部清除缺点:效率比较低(递归遍历全堆对象)清理出的内存不连续

  • 复制算法 新生代使用的算法, 缺点:浪费一半的内存空间

  • 标记整理算法 与标记清除算法比较类似, 缺点:标记存活对象与地址

3.GC分代回收

  • 新生代:0.8eden区 0.1×2 survivor区 复制算法

  • 年老代:标记清除 标记整理算法

  • 永久区:标记清除 标记整理

4.垃圾回收器

  • 串行回收期(serial collector):它只有一条GC线程(client模式默认采用模式)

    实现: serial适用于新生代, 采用复制算法, serial old适用于年老代, 采用标记整理算法
    标记压缩算法:首先找出年老代的存活对象,然后将他们滑动至堆的顶部,从而将所有的空闲空间留在堆尾部的连续块中,这使得任何在年老代的分配操作可以使用快速的指针碰撞技术。
    适用范围:对停顿时间要求不高和在客户端运行的应用

  • 并行回收期(parallel collector):吞吐量优先,它有多条GC线程(server模式默认采用模式)

    实现: ParNew适用于新生代, 采用复制算法;Parallel Scavenge, 适用于新生代, 采用复制算法;parallel old(多线程), 适用于年老代 采用标记整理算法
    适用范围:需要吞吐量高的应用

  • 并发搜集器(concurrent collector):它有一条或多条GC线程

    实现:需要在部分阶段暂停用户程序,CMS适用于年老代, 采用标记清除算法
    步骤:
    初始标记:stop, 快速标记存活对象,标记年老代GC root 直接可达的对象
    并发标记:并发标记所有从GC root可达的对象
    并发预清除:替代重现标记的一部分工作量
    重新标记:stop, 重新遍历并发标记阶段有变动的对象
    并发清除:清除未标记对象
    适用范围:低延时优先
    注意事项:
    吞吐量比较低,并且Minor GC的时间被拉长
    内存碎片
    并发模式失败 serial old作为备选

  • G1(CMS的替代者,简单提及,详细内容以后更新)

    实现:将堆分成一个大小相同的区域(Region),也分代(但是是一组Region,可能连续)
    将Region中的存活对象转移到另外的Region,然后收集

5.Minor GC与Full GC

  • Minor GC

    Eden区几乎总是空的,Eden区满会触发Minor GC
    Survivor区存放的对象至少经过一次Minor GC
    GC后Eden的存活对象被复制到未使用的Survivor区,被占用的Survivor区不够老的存活对象被复制到未使用的Survivor区,被占用的Survivor中足够老的存活对象被提升到年老代。
    过早提升和提升失败:如果一个Survivor区不够存放存活对象时,多余的对象被提前移动到年老代,如果年老代无法容纳更多的对象,Minor GC后会进行Full GC。


  • Full GC

    包含新生代、年老代、永久区


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。