一、简介

今天我们总结一道常见的关于垃圾回收的面试题:

  • JVM垃圾回收算法有哪几种?各自的优缺点?

我们都知道,JVM中堆可分为:

【a】新生代:

  • Eden区域
  • From(s0)区域
  • To(s1)区域

【b】老年代

如下图:

JVM垃圾回收的主要区域之一就是我们的堆。JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。

GC按照回收的区域又分了两种类型:

  • 普通GC(minor GC)
  • 全局GC(major GC or Full GC)

Minor GC和Full GC的区别

  •   普通GC(minor GC):只针对新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快。
  •   全局GC(major GC or Full GC):指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但并不是绝对的),Major GC的速度一般要比Minor GC慢上10倍以上 。

二、GC垃圾回收算法

【a】复制算法

复制算法原理:

Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到老年代中,也即一旦收集后,Eden是就变成空的了。

当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,通过-XX:MaxTenuringThreshold 来设定参数),这些对象就会成为老年代。

  • 优点:
  • 效率高
  • 缺点:
  • 1、使用复制算法浪费了一半的内存
  • 2、如果对象的存活率很高,那么我们需要将很多对象都复制一遍,并将所有引用地址重置一遍,复制所花费的时间,在对象存活率达到一定程度时,将会变的不可忽视。 所以使用复制算法,对象的存活率要非常低才行。

【b】标记清除算法

原理:标记清除算法分为标记和清除两个阶段,先标记出要回收的对象,然后统一回收这些对象。如下图描述:

用通俗的话解释一下标记清除算法,就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将要回收的对象标记一遍,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。

  • 优点:
  • 标记- 清除算法比较简单,也是最基础的算法。
  • 缺点:
  • 需要暂停整个应用,会产生内存碎片
  • 标记-清除算法效率并不高,如果有大量对象需要被回收,也就是需要对大量对象进行标记,显然标记这些对象耗费的时间将会比较长,所以标记的效率并不高

【c】标记压缩算法

原理:在整理压缩阶段,不再对标记的对像做回收,而是通过所有存活对像都向一端移动,然后直接清除边界以外的内存。可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。

  • 优点:
  • 弥补标记/清除算法当中,产生大量内存碎片的缺点;
  • 消除复制算法当中,内存减半的高额代价;
  • 缺点:
  • 效率不是很好

【d】分代收集算法

现代商用虚拟机基本都采用分代收集算法来进行垃圾回收。分代收集算法的思想,就是根据对象的不同生命周期,采用不同的垃圾回收算法,根据每一代的特点,选择最适合该代的回收算法,达到最高的回收效率。对象存活率比较低(新生代),使用复制算法,复制成本低;对象存活率高(老年代),采用标记-清理算法或者标记-整理算法。

三、总结

以上就是关于GC垃圾回收算法的一些总结,如果面试遇到相关问题,可以从垃圾回收的原理,然后讲述大体的流程,再说上优点、缺点,这道题应该就差不多了。更多关于GC相关的知识可以参考我的另外一篇文章:

https://blog.csdn.net/Weixiaohuai/article/details/86559166

面试题之GC垃圾回收算法相关推荐

  1. GC垃圾回收算法三种方式

    收 旧对象,破 对象,用不着的对象,用旧对象 .破对象 .用不着 的 对 象换 盆,换大铝盆,换各种盆...............啊哈哈哈是不是脑袋自动播放了...皮一下 1.判定对象存活算法 在回 ...

  2. 经典面试题:聊一聊垃圾回收算法

    关于垃圾回收算法的这道面试题,几乎是所有 3 年以上的 Java 面试中必问的题目,甚至有些好一点的公司会在校招时问到面试者.那么本文就系统的讲一下垃圾回收的算法,和 Hotspot 虚拟机执行垃圾回 ...

  3. go java gc_图解Golang的GC垃圾回收算法

    虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了. 以下是Golang GC算法的里程碑: v1.1 STW v1.3 Mar ...

  4. 垃圾回收算法与垃圾回收器

    Java与C++等语言最大的技术区别:自动化的垃圾回收机制(GC) 为什么要了解GC和内存分配策略 1.面试需要 2.GC对应用的性能是有影响的: 3.写代码有好处 栈:栈中的生命周期是跟随线程,所以 ...

  5. JVM内功心法-GC垃圾回收之GC垃圾回收过程

    JVM内功心法-GC垃圾回收之GC垃圾回收算法 GC 全称garbagecollection,垃圾回收.JAVA 为了屏蔽操作系统和平台之间的差异.选择的是采用 java 虚拟机来运行 java 应用 ...

  6. 22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制

    这篇文章不少地方都截图了宋红康老师的课件,实在他jvm这块讲的真好.连接地址如下: 尚硅谷宋红康JVM全套教程(详解java虚拟机)_哔哩哔哩_bilibili JVM入门 1.JVM结构图 JVM是 ...

  7. JVM(3)之垃圾回收(GC垃圾收集器+垃圾回收算法+安全点+记忆集与卡表+并发可达性分析......)

    <深入理解java虚拟机>+宋红康老师+阳哥大厂面试题2总结整理 一.堆的结构组成 堆位于运行时数据区中是线程共享的.一个进程对应一个jvm实例.一个jvm实例对应一个运行时数据区.一个运 ...

  8. 【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )

    文章目录 一.Java VisualVM 工具安装 Visual GC 插件 二.使用 Java VisualVM 分析 GC 内存 一.Java VisualVM 工具安装 Visual GC 插件 ...

  9. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  10. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

    文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...

最新文章

  1. 转 在b/s开发中经常用到的javaScript技术
  2. sql server 替换有反斜杠的字符串_SQL注入思维导图
  3. iOS对UIViewController生命周期和属性方法的解析
  4. 【计算机网络】——初识计算机网络
  5. OpenGL.tutorial06键盘和鼠标
  6. DynamicResource与StaticResource的区别
  7. C++一个简单的弹窗程序
  8. 大咖说|翼辉丁晓华:我们已经真正意义上感受到了原始创新带来的巨大价值
  9. AR拍照的实现核心代码
  10. Kotlin协程之launch
  11. word文档中插入图片显示不全解决办法
  12. 如何用计算机制作统计图,如何在EXCEL里做条形统计图?
  13. 让人傻傻分不清的TDD、ATDD、BDD
  14. MD5 转码 实现加密解密
  15. 【Java面试题】定义枚举类型Weekday,使用枚举类型配合switch语句,尝试如下功能:
  16. fastadmin 子账号看不到菜单,菜单没有查看,编辑等选项
  17. 【Pygame实战】经典的坦克大战游戏,勾起童年无限回忆《坦克大战小霸王版》
  18. KUDU(一)kudu概述
  19. 用20块的摄像头(不带fifo的OV7670)做WiFi实时传图小车
  20. 《大数据可视化技术》可视化大作业:“个人信息可视化展示”:1学习生活数据可视化 2社会社交关系可视化 3地理信息可视化 4其他个人数据可视化

热门文章

  1. 阿里云云计算 39在线实验--PolarDB MySQL
  2. 算法:Design Circular Deque(设计一个双端队列)
  3. golang 大数据平台_一文读懂数据平台、大数据平台、数据中台
  4. 推荐系统专利:一种信息推荐方法、系统及存储介质和终端设备
  5. 可视化修改SQL服务器名字,修改sql server服务器名称
  6. Ribbon和Feign的对比-带简易例子
  7. javaweb面试题目整理
  8. 两个线性空间的可逆线性映射
  9. OSG实时纹理提取 离屏渲染 输出到OpenCV 反向渲染 OSG摄像头反转 OSG动态模型 摄像机实时渲染
  10. 随机过程(二):更新过程的详细理解