垃圾回收算法

  • 一、分代收集理论
  • 二、标记-清除算法
  • 三、标记-复制算法
    • Appel式回收
  • 四、标记-整理算法

一、分代收集理论

当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计,分代收集名为理论,实际上是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上

  1. 弱分代假说:绝大多数对象都是朝生夕死的
  2. 强分代假说:熬过越多次垃圾收集过程的对象就越难消亡
  3. 跨代引用假说:跨代引用相对于同代引用仅占极少数

假说1,2共同奠定了多款常用的垃圾回收器的一致的设计原则:收集器应该将Java堆划分为不同的区域,然后将回收对象依据其年龄(即熬过垃圾回收过程的次数)分配到不同区域中存储。显而易见,如果一个区域中的对象大多数都是朝生夕死,难以熬过垃圾收集过程的话,那么把它们集中放在一起,每次回收只关注如何保留少量存活而不是去标记那些大量将要被回收的对象,就能以较低的代价回收大量的空间,如果剩下的都是难以消亡的对象,那么把它们集中放在一起,虚拟机就能以较低的频率来回收这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用

虚拟机一般会把Java堆划分为新生代和老年代两个区域,新生代中,每次垃圾收集时都会有大量对象死去,每次回收后存活的少量对象,将会逐步晋升到老年代中存放

根据垃圾收集的目标可分为:

  • 新生代收集(Minor GC/Young GC):目标只是新生代的收集
  • 老年代收集(Major GC/Old GC):目标只是老年代的收集。目前只有CMS收集器会有单独收集老年代的行为
  • 混合收集(Mixed GC):只目标是收集整个新生代和部分老年代的垃圾收集,目前只有G1收集器会有这种行为
  • 整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集

二、标记-清除算法

算法分为标记和清除两个部分,首先标记出需要回收的对象,在标记完成后,统一回收掉所有被标记的对象

算法的缺点:

  1. 执行效率不稳定,如果Java堆中包含大量的对象,而且其中大部分对象是需要回收的,这时必须进行大量标记和清除操作,导致标记和清除两个过程的执行效率都随着对象的数量增长而降低
  2. 内存空间碎片化,标记,清除之后会产生大量不连续的内存碎片,空间碎片过多会导致程序运行过程中需要分配较大对象时无法找到足够大的连续内存而不得不提前触发垃圾收集动作

三、标记-复制算法

简称复制算法,解决了标记-清除算法的缺点

思想是将可用的内存按容量分为两块,每次只用其中的一块,当这一块的内存用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次性清理掉

由于多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑内存空间碎片化的问题,只要移动堆顶指针,按顺序分配即可。这样实现简单,运行高效

缺点是:将可用内存缩小为原来一半,空间浪费太多

Appel式回收

把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor,发生垃圾收集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor,然后直接清理掉Eden区和已用过的Survivor空间

虚拟机默认Eden和Survivor大小比例是8:1,每次新生代中可使用内存空间为整个新生代容量的90%

四、标记-整理算法

标记-整理是针对老年代的算法

标记步骤和前面算法一样,整理步骤是让所有存活的对象都向内存空间的一端移动,然后直接清理掉边界以外的内存

JVM:垃圾回收算法相关推荐

  1. JVM 垃圾回收算法 -可达性分析算法!!!高频面试!!!

    前言:学习JVM,那么不可避免的要去了解JVM相关的垃圾回收算法,本文只是讲了讲了可达性分析算法,至于标记-清除.标记-复制,标记-整理,分代收集等等算法,会在近两天的文章中陆续更新出来. 很喜欢一句 ...

  2. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  3. JVM垃圾回收算法与原理详解

    垃圾回收 参考文档 GC参考手册-Java版 理解Java的强引用.软引用.弱引用和虚引用 JVM系列(五) - JVM垃圾回收算法 如何判断对象可以回收 引用计数法 参考文章 Java JVM的引用 ...

  4. jvm垃圾回收算法和垃圾回收器

    垃圾回收算法 jvm垃圾回收算法包括复制算法.标记清楚算法和标记整理算法,它们都基于分代收集理论.所谓分代收集理论,可以理解为jvm根据对象的生命年龄将他们分在不同的内存模块,也就是熟知的新生代和老年 ...

  5. jvm垃圾回收算法详解

    前言 相比C语言,JVM虚拟机一个优势体现在对对象的垃圾回收上,JVM有一套完整的垃圾回收算法,可以对程序运行时产生的垃圾对象进行及时的回收,以便释放JVM相应区域的内存空间,确保程序稳定高效的运行, ...

  6. JVM垃圾回收算法及垃圾回收器

    目录 一.垃圾回收GC (Garbage Collection) 1.1 垃圾回收介绍: 1.2  如何判断对象是否存活(被使用) 1.2.1 引用计数算法(已经废弃) 1.2.2 可达性分析 二.垃 ...

  7. 记录JVM垃圾回收算法

    垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法 JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代 ...

  8. JVM垃圾回收算法 总结及汇总

    先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回 ...

  9. Java基础:JVM垃圾回收算法

    众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...

  10. JVM 垃圾回收算法及回收器详解

    本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Python是 ...

最新文章

  1. 【转】C++ vector的reserve和resize详解
  2. 使用SSIS Slow Changing Transformation组件管理缓慢变化维
  3. MySQL实验7存储过程_mysql的总结7--存储过程-阿里云开发者社区
  4. 通道注意力机制_即插即用,Triplet Attention机制让Channel和Spatial交互更加丰富(附开源代码)...
  5. python绘制曲线y=2x+5_Python数据可视化:Matplotlib绘图详解(二)
  6. 由一道题目看抽象向量组的线性相关问题
  7. 2.2.4 ES 6语法与ES 5语法
  8. word导出手机端乱码或者打不开解决办法
  9. Diff 算法的执行过程数据响应式模拟routerSnabbdom
  10. 使用Xmanager 7连接centos7远程桌面
  11. 十一月英语——So it goes...
  12. 教室录播系统方案_精品课程录播教室建设方案
  13. NBA表格_1970到2019年NBA各赛季总冠军获得球队汇总!让你印象深刻的赛季
  14. 淘口令解析api接口_淘口令解析-super19911115的博客-51CTO博客
  15. 正则匹配电话号码 固定电话号码
  16. 后 R-CNN时代, Faster R-CNN、SSD、YOLO 各类变体统治下的目标检测综述:Faster R-CNN系列胜了吗?,(知乎ChenJoya大佬,讲的挺好的,记录一下)
  17. 两步建立自己的kindle书库
  18. labview调用solidworks3维模型
  19. JAVA-------封装+Private关键字+权限修饰符+This关键字
  20. 也谈Scrum Master的职业发展路径

热门文章

  1. nonebot2聊天机器人插件10:迁移至nonebot2.0.0b5
  2. Android——layout中使用include复用模块
  3. 【全套完结】通信原理----全套Matlab仿真实验报告
  4. 邬贺铨院士:网络安全不分国界,网络安全是人才的竞争
  5. 未来十年大趋势!风口加持之下必将再度繁荣!还不快来了解一下?
  6. Windows 自带的 Microsoft Edge 浏览器自动打开某一网页(浏览器被劫持)的解决办法
  7. 2005考研阅读Text4翻译
  8. java webclient使用_spring5 webclient使用指南详解
  9. 智慧旅游海内外现况详情及发展对策
  10. React——react-router-dom V6 使用