1、标记-清除算法

标记-清除算法分为“标记”和“清除”两个阶段,执行过程如下图所示:
1、标记:首先标记出所有需要回收的对象
2、清除:在标记完成后统一回收所有被标记的对象


标记-清除算法主要有两个不足:
1、效率问题,标记和清除的两个过程效率都不高
2、标记-清除会产生大量不连续的内存碎片,这会导致在后面需要分配连续的大对象时,无法找到足够大的连续内存而导致不得不提前触发另一次垃圾收集动作。

2、复制算法

复制算法的大致思路如下,其执行过程如下图所示:
1、首先将可用内存分为大小相等的两块,每次只使用其中的一块。
2、当这一块的内存用完了,就将还存活的对象连续复制到另一块上面,然后把使用过的内存空间一次清理掉。
复制算法的代价就是将内存缩小为原来的一半。

现在的商业虚拟机都是采用复制算法来回收新生代。
1、新生代的内存分为一块较大的Eden空间和两块较小的Survivor空间。
2、每次使用Eden和一块Survivor,当进行回收时,将Eden和Survivor中还存活的对象一次性复制到另一个Survivor空间上。然后,清理掉Eden和刚刚使用过的Survivor空间。
3、HotSpot虚拟机默认Eden和Survivor的大小比例为8 : 1,这样每次新生代可用内存为整个新生代的90% (10% + 80%),只有10%的内存会被浪费。

3、标记-整理算法

标记-整理算法分为“标记”和“整理”两个阶段,执行过程如下图所示:
1、标记:首先标记出所有需要回收的对象
2、整理:让所有的存活的对象都向一端移动,然后直接清除掉边界以外的内存。
标记-整理算法 采用和 标记-清除算法 一样的方式进行对象的标记,但后续不直接对可回收对象进行清理,而是将所有的存活对象往一端空闲空间移动,然后清理掉端边界以外的内存空间。

  • 优点:解决了标记-清理算法存在的内存碎片问题。
  • 缺点:仍需要进行局部对象移动,一定程度上降低了效率。

4、分代收集算法

当前商业虚拟机都采用分代收集的垃圾收集算法。分代收集算法,顾名思义是根据对象的存活周期将内存划分为几块。一般包括年轻代、老年代 和 永久代,如图所示:

新生代(Young generation)

绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为 minor GC。
新生代 中存在一个Eden区和两个Survivor区。新对象会首先分配在Eden中(如果新对象过大,会直接分配在老年代中)。在GC中,Eden中的对象会被移动到Survivor中,直至对象满足一定的年纪(定义为熬过GC的次数),会被移动到老年代
可以设置新生代和老年代的相对大小。这种方式的优点是新生代大小会随着整个堆大小动态扩展。

参数 -XX:NewRatio 设置老年代与新生代的比例。例如 -XX:NewRatio=8 指定 老年代/新生代 为8/1. 老年代 占堆大小的 7/8 ,新生代 占堆大小的 1/8(默认即是 1/8)。

老年代(old generation)

对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里。其所占用的空间要比新生代多。也正由于其相对较大的空间,发生在老年代上的GC要比新生代要少得多。对象从老年代中消失的过程,可以称之为major GC(或者full GC)。

小结

JDK8堆内存一般是划分为年轻代老年代不同年代根据自身特性采用不同的垃圾收集算法

  • 对于新生代,每次GC时都有大量的对象死亡,只有少量对象存活。考虑到复制成本低,适合采用复制算法。因此有了From Survivor和To Survivor区域。
  • 对于老年代,因为对象存活率高,没有额外的内存空间对它进行担保。因而适合采用标记-清理算法和标记-整理算法进行回收。

JVM几种垃圾回收算法相关推荐

  1. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...

    JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...

  2. JVM的三种垃圾回收算法

    一.什么是垃圾? 在了解垃圾回收机制之前我们首先要定义一下什么是垃圾,我们内存里大部分的对象都是随着方法的执行而创建,方法执行完毕后这些对象就不会被再次使用了,但是这些生成的对象不会被清除掉,所以我们 ...

  3. 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结

    BAT必考JVM系列专题 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置  垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过 ...

  4. 【JVM基础】垃圾回收算法详解(引用计数、标记、清除、压缩、复制)

    前言 笔记参考 Java 全栈知识体系.星羽恒.星空茶 文章目录 前言 垃圾回收概述 引用计数法 案例 优点 缺点 标记.清除.压缩 标记 清除 压缩 标记清除算法 优点 缺点 标记压缩算法 优点 缺 ...

  5. Java 垃圾回收机制与几种垃圾回收算法

    一.如何确定某个对象是"垃圾"? 这一小节先了解一个最基本的问题:如果确定某个对象是"垃圾"?既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,那么垃 ...

  6. 深入理解JVM之三:垃圾回收算法

    原文:http://blog.csdn.net/dd864140130/article/details/50084471 1. 标记--清除算法(Mark-Sweep) 标记--清除算法是第一种使用和 ...

  7. JVM : 12 面试题:JVM中有哪些垃圾回收算法,每个算法各自的优劣?

    主题:新生代进行垃圾回收的时候,到底是采取一种什么样的算法进行的呢? 1.复制算法的背景引入 针对新生代的垃圾回收算法,叫做复制算法. 新生代的内存分为两块,如下图: 假设有如下代码,在 " ...

  8. 深入浅出JVM内存模型+垃圾回收算法

    文章目录 前言 JVM内存模型 1. 程序计数器(记录当前线程) 2. Java栈(虚拟机栈) 3. 本地方法栈 4. 堆 5.方法区 6.直接内存 JVM垃圾回收 垃圾判断标准 1. 引用计数法 2 ...

  9. 016、JVM实战总结:大厂面试题:JVM中有哪些垃圾回收算法,每个算法各自的优劣?

    1.前文回顾 略... 2.复制算法的背景引入 略... 3.一种不太好的垃圾回收思路 标记清除算法 - 碎片多 4.一个合理的垃圾回收思路 : 假设新生代内存,一半用来放新对象,一半用来存放从另一半 ...

最新文章

  1. 【APUE】文件 I/O 操作
  2. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组
  3. 技术实践 | 网易云信视频转码提速之分片转码
  4. HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)
  5. SkyWalking配上告警更优秀
  6. Mongo读书笔记1 -- GridFS
  7. pytorch 图像分割的交并比_「通知」《深度学习之图像识别》再版工作启动,欢迎指导和提建议...
  8. java基础经典练习题
  9. js关于子元素不触发父元素事件的若干方法
  10. WPF中自定义MarkupExtension
  11. 记一次SQLServer2019安装和卸载问题的解决过程
  12. 中值滤波_中值滤波原理
  13. 状态良好(恢复分区)空间的删除的方法
  14. 为什么函数极值点的导数为零
  15. Win32_VideoController 显卡 参数说明
  16. 揭秘 手机群控 带来的利益
  17. 什么是云原生中台业务架构?
  18. java入门基础(四)
  19. EasyNVS摄像机公网全终端无插件网页摄像机直播管理服务之网页无插件直播服务搭建流程
  20. kmeans算法c语言实现,能对不同维度的数据进行聚类

热门文章

  1. 利用telex离线下载国外网盘资源
  2. 北大青鸟BENET课程---ENBM知识点总结
  3. U盘被写保护,很有用的方法,我刚有过
  4. 网站安全狗IIS版、服务器安全狗Windows版
  5. 牛奶生产线的分类有哪些?
  6. iwebshop商户手机模板_iWebShop网站手机验证码、订单到货商户等短信模板
  7. 姜思达和机器人_中国偏见地图曝光:百度大数据看穿了一切
  8. Android平移补间动画,Android 补间动画之平移动画TranslateAnimation
  9. mysql5.7.10源码安装_MySQL 5.7.10最新版本号源码安装具体过程
  10. 凡是过往,皆为序章—写在2018年国基揭榜之时