问题:请讲下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. 我自横刀向天笑,手写Spring IOC容器,快来Look Look!

    目录 IOC分析 IOC是什么 IOC能够带来什么好处 IOC容器是做什么工作的 IOC容器是否是工厂模式的实例 IOC设计实现 设计IOC需要什么 定义接口 一:Bean工厂接口 二:Bean定义的 ...

  2. 什么?女神发了朋友圈,快来围观之Java设计模式:观察者模式

    目录 观察者模式 示例 定义 设计原则 意图 主要解决问题 何时使用 优缺点 女神和追求者的故事 Java中的实现 观察者模式 示例 微信公众号,关注就可以收到推送的消息,取消关注就不会收到 定义 定 ...

  3. Day13_67_interrupt() 方法

    interrupt() 方法 中断线程 * interrupt()方法的简单理解 - interrupt() 方法只是改变线程的阻塞状态而已,让一个正在阻塞状态的线程,恢复执行.但是它不会中断一个正在 ...

  4. 请求转发(forward)和请求包含(include)的区别?

    请求包含的例子 第一个Servlet (DispatcherServlet) @Override protected void doGet(HttpServletRequest req, HttpSe ...

  5. red and black(BFS)

    Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 40685   Accepted: 22079 D ...

  6. android调用号和libc

    调用号(以arm平台为例)在/bionic/libc/kernel/uapi/asm-arm/asm/unistd.h: /* WARNING: DO NOT EDIT, AUTO-GENERATED ...

  7. php、jsp、asp和aspx的区别

    目录 PHP JSP ASP ASP.NET PHP PHP是一种跨平台的服务器端的嵌入式脚本语言.它大量地借用C.Java 和 Perl 语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地 ...

  8. PHP Proxy 负载均衡技术

    <?php $whitelistPatterns = array( ); $forceCORS = false; $anonymize = true; $startURL = "&qu ...

  9. Redis笔记整理

    Redis 遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库.数据结构服务器. 特点:     1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时 ...

  10. Win64 驱动内核编程-12.回调监控进线程创建和退出

    回调监控进线程创建和退出 两个注册回调的函数:PsSetCreateProcessNotifyRoutine   进程回调PsSetCreateThreadNotifyRoutine    线程回调分 ...