问题:请讲下java中垃圾回收器有哪些?

分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器

回答要点:

主要从以下几点去考虑,

1、垃圾回收器的种类

2、每种垃圾回收器的着重点是什么

前边的文章中分享了“如何设计一个垃圾回收器”、“垃圾回收算法”、“垃圾回收中的并行并发”等,今天打算分享下hotspot虚拟机中的垃圾回收器。

先看下垃圾回收器的分类,分类标准有按照垃圾回收线程和用户线程的关系、工作的内存区域

垃圾回收线程和用户线程的关系

串行

serial、serial old

并行

parNew、parallel Scavenge、parallel old

并发

CMS、G1

工作的内存区域

年轻代

serial、parNew、parallel Scavenge

年老代

serial old、parallel old、CMS

年轻代、年老代

G1

有了上面的分类,对hotspot虚拟机下的垃圾回收器大致有了了解,下面重点介绍。

serial

serial使用复制算法,作用在年轻代。同时垃圾回收线程是单线程的,也就是串行回收。以减少系统的停顿时间为目的。

serial old

serial old使用标记-整理算法,作用在年老代。垃圾回收线程是单线程,是串行回收。它是serial的年老代版本。以减少系统的停顿时间为目的

parNew

parNew使用复制算法,作用在年轻代。垃圾回收线程是多线程的,是并行回收。它可以相当于serial的多线程版本。以减少系统的停顿时间为目的

parallel Scavenge

parallel Scavenge使用复制算法,作用在年轻代。垃圾回收线程是多线程的,是并行回收。以控制系统的吞吐量为目的,适合后台计算型的任务。

parallel old

parallel Old使用标记-整理算法,作用在年老代。垃圾回收线程是多线程的,是并行回收的,是parallel Scavenge的年老代版本。

CMS

CMS使用标记-清除算法,作用在年老代。垃圾回收是多线程的,且和用户线程是并发执行的。以获取最少的系统停顿时间为目的。收集的过程如下,

  • 初始标记
  • 并发标记
  • 重新标记
  • 并发清除

示意图如下,

在上面的4个阶段中,初始标记和重新标记都存在stop the world的现象,前者是单线程串行,后者是多线程并行,在并发标记和并发清除阶段则属于并发执行。由于使用的是标记-清除算法,所以在垃圾回收后会存在垃圾碎片的情况;由于是在并发清除阶段用户线程还在运行中,所以会存在浮动垃圾无法回收的情况,

G1

G1作为一款主流的垃圾回收器,从整体上而言使用的是标记-整理算法,具体到每两个region使用的是复制算法,具有以下的特点,

  • 充分利用并行与并发的优势
  • 分代收集,在G1中仍然保持着分代收集的概念,但是不需要搭配其他收集器,它自己就可以管理整个堆,而且年轻代和年老代不再是物理隔离的,取而代之的是把整个堆分为很多大小相等的独立区域,称为region,年轻代就是一组region的集合。
  • 空间整合,由于从整体上看使用标记-整理算法,从每两个region上看使用复制算法,所以使用G1不会产生垃圾碎片。
  • 可预测的停顿时间,G1和CMS都是以减少停顿时间为目的,和CMS不同的是G1建立了一套可预测的停顿时间模型。

G1分为以下几个阶段

  • 初始标记
  • 并发标记
  • 最终标记
  • 筛选回收

示意图如下,

除了上面介绍的7款垃圾回收器外,现在还有一个ZGC,是比较新的垃圾回收器,这个计划后续再研究。

衡量一款垃圾回收器的好坏,主要看两个关键指标:停顿时间、吞吐量。针对这两个指标的解释,可以参见《java面试一日一题:如何设计一款垃圾回收器》。

停顿时间重点关注用户线程的停顿时长,主要影响的是和用户的交互上,反应在系统的响应速度;吞吐量则关注的是高效利用CPU时间,完成后台的计算任务。综上,如果是和用户交互的系统,请选择以减少停顿时间为目的的垃圾回收器,如果是后台的定时任务等耗时的计算任务,请选择以提升吞吐量为目的的垃圾回收器。

有不正之处,欢迎指正,谢谢

java面试一日一题:java中的垃圾回收器的更多相关文章

  1. java面试一日一题:再谈垃圾回收器中的串行、并行、并发

    问题:请讲下java中垃圾回收器的串行.并行.并发 分析:该问题主要考察在垃圾回收过程中垃圾回收线程和用户线程的关系 回答要点: 主要从以下几点去考虑, 1.串行.并行.并发的概念 2.如何考虑串行. ...

  2. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  3. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  4. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  5. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  6. java面试一日一题:java线程池

    问题:请讲下java中的线程池 分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少 回答要点: 主要从以下几点去考虑, 1.为什么要使用 ...

  7. java面试一日一题:如何判断一个对象是否为垃圾对象

    问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...

  8. java面试一日一题:如何设计一款垃圾回收器

    问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...

  9. java面试一日一题:java中一个对象实例的结构是什么样子的

    问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的 分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的 回答要点: 主要从以下几点去考虑, ...

随机推荐

  1. 【CPU100%排查】CPU100%问题排查方案

    1.使用top -c 查看CPU 占用情况 ,按P(大写)可以倒序查看占CPU占用率  2.找到占用率高的进程以后,再定位到具体线程 比如 此时进程ID 14724 CPU占用高,进一步使用top - ...

  2. hdu 4309 最大流 + DFS

    题意:      给以三种有向边     (1) 隧道,可以过无数人,也可以藏c个人.     (2) 路,只能过人(流量INF).     (3)古桥,如果不修理可以过1个人,修理可以过无数个人,但 ...

  3. 数据库的读写分离(Amoeba)

    目录 Amoeba Amoeba读写分离的配置 Amoeba Amoeba(变形虫) 项目,该开源框架于2008年开始发布一款 Amoeba for Mysql软件. 这个软件基于Java致力于MyS ...

  4. hdu4909 状态压缩(偶数字符子串)

    题意:       给你一个字符串,里面最多有一个'?','?'可以表示'a' - 'z',也可以什么都不表 示,这里要明确,什么都不表示不是不存在的意思,当aa什么都不表示的时候aa 也不等于aa? ...

  5. Win64 驱动内核编程-9.系统调用、WOW64与兼容模式

    系统调用.WOW64与兼容模式 这种东西都是偏向于概念的,我就把资料上的东西整理下粘贴过来,资料来源于胡文亮,感谢这位前辈. WIN64 的系统调用比 WIN32 要复杂很多,原因很简单,因为 WIN ...

  6. 详解 WebRTC 传输安全机制:一文读懂 DTLS 协议

    作者|进学 审校|泰一 DTLS (Datagram Transport Layer Security) 基于 UDP 场景下数据包可能丢失或重新排序的现实情况下,为 UDP 定制和改进的 TLS 协 ...

  7. angr脚本——以angrctf解题记录为参考

    angr脚本--以angrctf解题记录为参考 ​ angr是用于逆向工程中进行二进制分析的一个python框架 ​ 符号执行 (Symbolic Execution)是一种程序分析技术.其可以通过分 ...

  8. Mybatis-Plus03 代码自动生成器

    先看完Mybatis-Plus01和Mybatis-Plus02再看Mybatis-Plus03 AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerato ...

  9. 使用TK框架中selectByPrimaryKey

    使用TK框架中selectByPrimaryKey(Object key),需要注意要在entity里注明哪个字段是主键,否则会不知道哪个是PrimaryKey会随机一个字段就报错. 如下: 引入 i ...

  10. 04.06 UCF Local Programming Contest 2017

    A.Electric Bill 题意:简单计算题,超过1000部分额外算 1 #include<stdio.h> 2 int main(){ 3 int money1,money2; 4 ...