Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第27讲 | Java常见的垃圾收集器有哪些?

垃圾收集算法
对象实例收集
标记-整理算法
标记-清除算法
复制算法
可达性分析
引用计数算法
-XX:GCTimeRatio=N
-XX:MaxGCPauseMillis=value
-XX:+UseParallelGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseSerialGC
GC的新发展
垃圾收集过程的理解
垃圾收集的原理和基础概念
垃圾收集器工作的基本流程
垃圾收集的算法
G1 GC
Parallel GC
CMS GC
ParNew GC
Serial GC
一课一练
知识扩展
考点分析
典型回答
Java常见的垃圾收集器

该思维导图由 AI 生成,仅供参考

垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。
今天我要问你的问题是,Java 常见的垃圾收集器有哪些?

典型回答

实际上,垃圾收集器(GC,Garbage Collector)是和具体 JVM 实现紧密相关的,不同厂商(IBM、Oracle),不同版本的 JVM,提供的选择也不同。接下来,我来谈谈最主流的 Oracle JDK。
Serial GC,它是最古老的垃圾收集器,“Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-World”状态。当然,其单线程设计也意味着精简的 GC 实现,无需维护复杂的数据结构,初始化也简单,所以一直是 Client 模式下 JVM 的默认选项。
从年代的角度,通常将其老年代实现单独称作 Serial Old,它采用了标记 - 整理(Mark-Compact)算法,区别于新生代的复制算法。
Serial GC 的对应 JVM 参数是:
-XX:+UseSerialGC
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java垃圾收集器是Java的重要特性之一,本文详细介绍了Oracle JDK中常见的垃圾收集器,包括Serial GC、ParNew GC、CMS GC、Parallel GC和G1 GC。文章从垃圾收集的基本原理、算法和工作流程入手,深入解析了每种垃圾收集器的特点、适用场景和对应的JVM参数。作者强调了对垃圾收集器原理的了解对于面试者来说是加分项,并指出了Java垃圾收集器的发展趋势。此外,文章还提到了垃圾收集算法的分类和垃圾收集过程中各个区域的变化。最后,文章指出了Java垃圾收集器仍在不断发展,介绍了最新的JDK实现中的新型垃圾收集器。整体而言,本文内容全面,涵盖了Java垃圾收集器的基本知识和发展趋势,适合读者快速了解Java垃圾收集器的概况。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • 张南南
    JDK8的话,互联网B/S项目,追求高响应和底停顿,请问是用CMS好还是G1好呢,或者有其他更好的选择

    作者回复: 没有绝对,我建议综合考虑: G1理论上比cms更容易调,但你更熟悉哪个?实际用cms的挺多,也许更多经验; 如果都不熟,先看看g1能否达到你的延迟、吞吐目标; 还有基础配置,如堆大小,比较大,比如16g以上,建议优先g1

    2018-07-11
    2
    23
  • 家庆
    老师,能整理一份每个jdk 版本对应默认的GC是什么吗?为什么会变更,优势在哪里,谢谢!

    作者回复: client vm mode(win 32)一直是Seiral GC,servermode下,9以后改为了G1,以前是Parrallel Gc

    2018-08-18
    15
  • achenbj
    g1不是8的默认回收器?

    作者回复: 不是,8是parallel gc

    2018-11-21
    10
  • Jerry银银
    老师:做Android应用层开发的同学该如何学习虚拟机?Android系统中的虚拟机,估计也只有系统厂商能修改和优化。有时候感觉学了很多虚拟机的理论,但是用在工作中的场景不多,也只有在“内存优化”和开发中编写代码时会用到一些jvm内存区域相关知识

    作者回复: 了解相关原理有利于我们写出更好的程序,或者做更深入的工作或者特定优化; 当然,我也不认为什么工作都有必要过度深入jvm,尽管一些公司喜欢这么考察,职业发展和市场需求也不是只有一条路

    2019-01-25
    9
  • Chris
    老师,python支持那里好像有笔误,应该是同时支持引用计数和可达性等垃圾收集机制。其二,标记清楚算法不适合大堆,请问这里的大堆有什么可以量化的标准吗?比如多大的堆才是大堆😂,希望老师能解答下,谢谢~

    作者回复: 有道理,意思是一样,只是一些搞python的同学,喜欢把引用计数以外的才称做gc;大小没有那么绝对,调优永远是针对特定场景、特定需求,不存在一劳永逸的指标,一般建议30G以上慎用cms,但你看Cassandra的官方指南,建议用在16g以下

    2018-07-07
    6
  • Evan
    直接分配到老年代的对象在年轻代有空间了会移动回来吗?

    作者回复: 不会

    2018-07-18
    4
  • 雪粮
    ZGC如此强大,非常期待! 咨询大师,Java未来有没有计划让手动内存回收辅助自动内存回收以提高回收效率?既默认情况下自动内存回收完全没问题,但在极致情况下允极客开发者介入甚至完全接管内存回收过程(类似与C和C++)以提高程序执行效率?

    作者回复: 现在有一些手段影响gc,或者用直接内存再显式释放,更近一步我不知道了

    2018-07-09
    4
  • null
    老师,请问一下,当Survivor满了而且Survivor中的对象还没有达到进去老年代的年龄后怎么处理,是会增加Survivor的大小吗还是直接将Survivor中的对象放到老年代呢

    作者回复: 发生promotion,放到老年代; maxtenuringthreshold是个上限值

    2018-07-09
    2
    2
  • 李二木
    用过-XX:+PrintGCDetails,打印比较详细

    作者回复: 这个jdk9已经deprecated了哦

    2018-07-07
    2
  • 南山
    老师,Oracle的jvm的CMSGC,本身能够解决内存碎片化的问题吗?

    作者回复: 我理解是目前实现不能完全避免,cms又不再发展了

    2018-07-17
    2
    1
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部