前面我们说了如何判断对象的生存与死亡,JVM判断了对象的生存与死亡之后需要一定的策略区回收死亡对象。本篇博客对四种常用的GC算法的思想进行一些说明。

  1. 标记——清除算法:
最基础的算法,分为标记和清除两个阶段。首先标记出需要回收的对象(对象的生存笔记的标记方法),完成标记后统一回收所有被标记的对象。主要有两个缺点:1.效率问题,标记和清除效率都不高;2.空间问题,标记清除后会产生大量不连续的空间碎片,空间碎片太多会导致分配较大对象时无法找到足够的连续内存,不得不提前触发GC。  
  1. 复制算法(针对新生代):
为了解决效率问题。将内存分为大小相等的两块A、B,每次只使用一块,当A内存使用完,则将存活的对象复制到B(移动堆顶指针,顺序放置,保证空间连续),然后将A进行清理,如此进行重复,每次只对A或B进行操作。这样不需要考虑内存空间碎片问题。复制算法的优点:(1)每次都是对整个半区进行内存回收,实现简单、运行也高效;(2)在那块使用内存上进行内存分配时,不用考虑内存碎片的问题,只要移动堆顶指针,按顺序分配内存即可;缺点:将内存缩小为原来的一半,代价较高。
现在的商业虚拟机都采用这样的方法回收新生代,根据IBM研究新生代中的对象98%都是朝生夕死,所以不需要按照1:1分配,而是将内存分为Eden与两块较小的SurvivorA,SurivivorB。每次使用Eden与SurvivorA,回收时将Eden与SurivivorA中存活的对象一次性拷贝到SurvivorB,然后清理Eden与SurvivorA;如果SurvivorB内存空间不够,通过内存担保机制放入老年代中(相当于老年代存放新生代中多次GC依然存活的对象,设置对象年龄来确定哪些对象要放置到老年区)。
  1. 标记整理算法(老年代):
复制收集算法在对象存活率较高时,执行较多的复制操作,效率较低,最关键是,如果不想浪费50%内存,需要额外内存空间进行内存担保,所以老年代不适合这样的算法。标记过程仍然与“标记-清除”算法中一样,但是在标记完成后并不直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
       
  1. 分代收集算法
 当前商业虚拟机都采用这个“分代收集”算法(Generation Collection),它根据对象存活周期的不同将内存划分为几块,一般是把java堆分为新生代和老年代,根据各个年代的特点选用不同的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,因此可以选用“复制算法”,此时只需要付出少量存活对象的复制成本即可;对于老年代,因为对象存活率较高、也没有额外空间为期分配担保,就必须使用“标记-清除”或“标记-整理”算法来进行回收。

JVM读书笔记之GC算法相关推荐

  1. 《深入理解java虚拟机》笔记2——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  2. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

  3. 【JVM】四种GC算法(分代收集+三种标记算法)

    目录 参考文章 四种GC算法 分代收集算法(理论) 标记清除算法 标记整理算法 标记复制算法 三种算法的优缺点 参考文章 JVM的4种垃圾回收算法.垃圾回收机制与总结_我是guyue,guyue就是我 ...

  4. JVM的四种GC算法

    介绍 程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在 ...

  5. JVM常见4种GC算法

    JVM常见GC算法 1.标记-清除算法(Mark-Sweep) 2.标记-整理(压缩)算法(Mark-Compact) 3.复制算法(Copying) 4.分代收集(Generational Coll ...

  6. JVM 知识梳理 (二) GC算法

    文章目录 一.前言 二.判定哪些对象需要被GC 引用计数法Reference Count 可达性算法(引用链法Tracing) 三.GC算法 标记-清除 标记-压缩 复制算法 总结 分代收集 补充:H ...

  7. Java JVM 读书笔记 - 虚拟机性能监控和故障处理工具

    给系统定位问题,知识.经验是关键基础,数据时依据,工具是运用知识处理数据的手段. 数据:运行日志    异常堆栈  GC日志  线程快照(threaddump/javacore文件)  堆转储快照(h ...

  8. 垃圾回收算法简单介绍——JVM读书笔记lt;二gt;

    垃圾回收的过程主要包含两部分:找出已死去的对象.移除已死去的对象. 确定哪些对象存活有两种方式:引用计数算法.可达性分析算法. 方案一:引用计数算法 给对象中加入一个引用计数器.每当有一个地方引用它时 ...

  9. 深入理解JVM读书笔记--内存管理

    2019独角兽企业重金招聘Python工程师标准>>> 一. Java的运行时数据区域 (1)程序计数器(线程私有):是一块较小的内存空间,它的作用是当前线程所执行字节码的行号指示器 ...

最新文章

  1. ios 动态监听键盘输入法和高度
  2. java lwjgl3_java-LWJGL 3鼠标移动
  3. scala中akka actor例子
  4. 一纬度横直线等于多公里_必备 | 高中物理必修一、必修二知识点提纲,预习复习一次搞定!...
  5. linux vbox安装mac os,超简单的linux下virtualbox4.3.26安装配置黑苹果 OSX 10.9的办法
  6. 解决react状态管理---React Query
  7. 【HAVENT原创】NodeJS 短网址开发(调用第三方接口)
  8. 28.java中Java8.0的新特性(附讲解和练习)
  9. 记一次rm -rf之后的数据恢复操作
  10. 手游天龙八部服务器注册上限,腾讯手游助手注册已达上限怎么办 | 手游网游页游攻略大全...
  11. 元子弹老师-吉他指弹右手技巧
  12. 抽象类和接口的异同点
  13. eclipse项目类型的转换
  14. 怎么看R语言是不是在运行_五个方法,教你怎么看自己电脑的硬盘是不是固态硬盘?...
  15. 分布式数据库如何实现主键全局自增?
  16. 利用上位机显示毫米波雷达数据
  17. 北大java面试,北大青鸟java 面试--常见面试题(下)
  18. 由一个骂评引发的作者产品体验报告-----我要集气
  19. 提交微信小程序代码到微信代码管理git上
  20. 微信小程序之触摸滑动事件案例+Slideview组件【手动左滑删除效果】

热门文章

  1. 【论文写作】如何写科技论文?万能模板!!!(以IEEE会议论文为例)
  2. 怎么知道自己的计算机成绩,小黑盒如何查看我的电脑 电脑查成绩方法
  3. OpenCV常用函数记载
  4. 【科研思考】如何做学术研究?—— 我的方法论
  5. k8s 1.22 安装ingress报错
  6. 第七届开源操作系统年度技术会议(OS2ATC)盛大开幕,从编译器到软件定义卫星精彩议题大曝光
  7. ClickHouse基于全局字典与物化视图的精确去重方案
  8. ThinkPad安装Mac
  9. 癫痫脑电信号基础知识
  10. Rancid cvs ViewVC 安装配置