Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43250 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

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

杨晓峰 2018-07-07
垃圾收集机制是 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • 公号-代码荣耀
    JVM提供的收集器较多,特征不一,适用于不同的业务场景:

    Serial收集器:串行运行;作用于新生代;复制算法;响应速度优先;适用于单CPU环境下的client模式。
    ParNew收集器:并行运行;作用于新生代;复制算法;响应速度优先;多CPU环境Server模式下与CMS配合使用。
    Parallel Scavenge收集器:并行运行;作用于新生代;复制算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。

    Serial Old收集器:串行运行;作用于老年代;标记-整理算法;响应速度优先;单CPU环境下的Client模式。
    Parallel Old收集器:并行运行;作用于老年代;标记-整理算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。
    CMS收集器:并发运行;作用于老年代;标记-清除算法;响应速度优先;适用于互联网或B/S业务。

    G1收集器:并发运行;可作用于新生代或老年代;标记-整理算法+复制算法;响应速度优先;面向服务端应用。
    2018-07-08
    65
  • 一孑
    老师有个问题不太明白,full gc、major gc、minor gc都会stop_the_word吗?还是说是跟具体的垃圾收集算法有关系?
    2018-07-19
    12
  • 张南南
    JDK8的话,互联网B/S项目,追求高响应和底停顿,请问是用CMS好还是G1好呢,或者有其他更好的选择

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

    2018-07-11
    6
  • achenbj
    g1不是8的默认回收器?

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

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

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

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

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

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

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

    2018-07-07
    3
  • 黄黄的叶子
    jdk 9 用 -Xlog:gc*
    以前用 -XX:+PringGCStamps -XX:+PringGCDetails
    2019-03-01
    1
    2
  • Evan
    直接分配到老年代的对象在年轻代有空间了会移动回来吗?

    作者回复: 不会

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

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

    2018-07-09
    1
    1
  • 三木子
    用过-XX:+PrintGCDetails,打印比较详细

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

    2018-07-07
    1
  • William
    老师,有个疑问.

    请问“第二, 经过一次 Minor GC,Eden 就会空闲下来,直到再次达到 Minor GC 触发条件,这时候,另外一个 Survivor 区域则会成为 to 区域,Eden 区域的存活对象和 From 区域对象,都会被复制到 to 区域,并且存活的年龄计数会被加 1。”

    如果此时: Eden 区域的存活对象和 From 区域对象 的需要内存大小 > to 区域的内存, 怎么处理的? 只是直接存储到永久代了么?
    2019-11-29
  • 日光倾城
    垃圾收集过程中,新生代的From区和To区应该是只有存活的对象才会被移动吧
    2019-10-13
  • 日光倾城
    对于对象实例收集,主要是两种基本算法
    ,这个算法和常用的垃圾收集算法里面的算法是什么关系?
    2019-10-11
  • Xs.Ten
    老师好,minor GC 发生第三次及以上的时候,from和to区域的角色会发生互换吗?不然的话,to中不是会存在标记为1的引用吗?还是存在会讲to的内容复制到from?
    2019-09-02
  • Lh
    JVM提供的收集器较多,特征不一,适用于不同的业务场景:

    Serial收集器:串行运行;作用于新生代;复制算法;响应速度优先;适用于单CPU环境下的client模式。
    ParNew收集器:并行运行;作用于新生代;复制算法;响应速度优先;多CPU环境Server模式下与CMS配合使用。
    Parallel Scavenge收集器:并行运行;作用于新生代;复制算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。

    Serial Old收集器:串行运行;作用于老年代;标记-整理算法;响应速度优先;单CPU环境下的Client模式。
    Parallel Old收集器:并行运行;作用于老年代;标记-整理算法;吞吐量优先;适用于后台运算而不需要太多交互的场景。
    CMS收集器:并发运行;作用于老年代;标记-清除算法;响应速度优先;适用于互联网或B/S业务。

    G1收集器:并发运行;可作用于新生代或老年代;标记-整理算法+复制算法;响应速度优先;面向服务端应用。
    2019-07-28
  • 张旭
    老师,根据你画的minor gc图,minor gc发生时不会回收from区中的垃圾吗?
    2019-04-14
  • 进阶的码农
    UseCMSCompactAtFullCollection:在jvm1.8起已弃用,此标识已deprecated
    CMSFullGCsBeforeCompaction::在jvm1.8起已弃用,此标识已deprecated
    java8弃用这两个参数,那cms回收如何进行空间压缩?
    2019-02-27
  • HaoBin-Leo
    为什么有些文章会在serial old后面加上msc备注,serial old 不是采用的mark-compact么
    2018-11-13
  • 陈华应
    老师,Oracle的jvm的CMSGC,本身能够解决内存碎片化的问题吗?

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

    2018-07-17
收起评论
21
返回
顶部