GC 垃圾收集器

  Java 堆内存采用分代回收算法,因此 JVM 针对新生代和老年代提供了多种垃圾收集器。

1. Serial 收集器

  Serial 收集器是单线程收集器,采用复制算法

  是最基本的垃圾收集器,只会使用一个 CPU 或一条线程去完成垃圾收集工作,在垃圾收集时必须停止其他工作线程知道垃圾收集结束。

  • 单线程收集器

  • 使用复制算法

  • 收集时需要暂停其他所有线程

  • 简单高效,没有线程交互开销,垃圾收集效率最高

  • 是 JVM 在 Client 模式下默认的新生代垃圾收集器

2. Serial Old 收集器

  是 Serial 收集器的老年代版本

  • 单线程收集器

  • 使用标记整理算法

  • 收集时需要暂停其他所有线程

  • 是 JVM 在 Client 模式下默认的老年代垃圾收集器

  • 是 JVM 在 Server 模式下 CMS 的后备收集方案

3. ParNew 收集器

  ParNew 垃圾收集器是 Serial 的多线程版本,也采用复制算法,其余行为和 Serial 完全一样。

  • 多线程收集器

  • 使用复制算法

  • 收集时需要暂停其他线程

  • 默认开启和 CPU 数目相同的线程数,通过-XX:ParallelGCThreads参数设置线程数

  • 是 JVM 在 Server 模式下默认的新生代垃圾收集器

4. Prarllel Scavenge 收集器

  Prarllel Scavenge 收集器是一个新生代垃圾收集器,采用复制算法,是一个多线程的垃圾收集器,它的侧重点是程序达到可控的吞吐量,高吞吐量可以最高效率的利用 CPU 资源。

  • 多线程收集器

  • 使用复制算法

  • 注重提高系统吞吐量,提高 CPU 利用率

  • 具有自适应调节策略

5. Prarllel Old 收集器

  Prarllel Scavenge 收集器的老年代版本,使用多线程标记整理算法。如果系统对吞吐量要求较高,可以采用 Prarllel Scavenge 与 Prarllel Old 搭配策略。

  • 多线程收集器

  • 使用标记整理算法

  • 注重提高系统吞吐量

6. CMS 收集器

  CMS 收集器是一种老年代收集器,主要目标是获得最短垃圾回收停顿时间,以获得较高的响应比,提高用户体验。使用多线程的标记清除算法。

  • 多线程收集器

  • 使用标记清除算法

  • 注重缩短垃圾收集停顿时间,追求高响应比

工作机制如下:

  • 初始标记:只标记 GC Roots 能直接关联的对象,速度快,需要暂停所有线程

  • 并发标记:进行 GC Roots 追踪,和用户线程一起工作,不需要暂停

  • 重新标记:修正在并发标记期间,用户线程运行而导致标记改变的对象,需要暂停所有线程

  • 并发清除:清除 GC Roots 不可达对象,和用户线程一起工作,不需要暂停

  由于耗时最长的并发标记和并发清除不需要暂停其他线程,CMS 可近似看做与用户线程并发执行。

7. G1 收集器

  Garbage First 垃圾收集器是目前垃圾收集器理论最前沿的成果。

  G1 避免全区域垃圾收集,把堆内存划分为大小固定的几个独立区域,并跟踪这些区域的垃圾收集进度,在后台维护一个优先级列表,每次根据允许收集时间来优先回收垃圾最多的区域。

相较于 CMS,G1 有如下优势:

  • 基于标记整理算法,不产生内存碎片

  • 可精确控制停顿时间,在不牺牲吞吐量的前提下实现低停顿回收

8. 总结

收集器 运行模式 工作范围 算法 目标 适用场景
Serial 串行 新生代 复制算法 响应速度优先 单CPU环境下的Client模式
Serial Old 串行 老年代 标记整理 响应速度优先 单CPU环境下的Client模式、CMS的后备预案
ParNew 并行 新生代 复制算法 响应速度优先 多CPU环境时在Server模式下与CMS配合
Parallel Scavenge 并行 新生代 复制算法 吞吐量优先 在后台运算而不需要太多交互的任务
Parallel Old 并行 老年代 标记整理 吞吐量优先 在后台运算而不需要太多交互的任务
CMS 并发 老年代 标记清除 响应速度优先 集中在互联网站或B/S系统服务端上的Java应用
G1 并发 Both 复制+标记整理 响应速度优先 面向服务端应用,将来替换CMS

JVM学习笔记——GC垃圾收集器的更多相关文章

  1. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  2. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  3. 【JVM】-NO.110.JVM.1 -【GC垃圾收集器】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  4. JVM学习笔记——GC算法

    GC 算法 GC 即 Garbage Collection 垃圾回收.JVM 中的 GC 99%发生在堆中,而 Java 堆中采用的垃圾回收机制为分代收集算法.即将堆分为新生代和老年代,根据不同的区域 ...

  5. 【JVM学习笔记】类加载器

    概述 类加载器用来把类加载到Java虚拟机中.从JDK1.2版本开始,类的加载过程采用父委托机制,这种机制能更好地保证Java平台的安全.在此委托机制中,除了Java虚拟机自带的根类加载器以外,其余的 ...

  6. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  7. 【Java虚拟机】JVM学习笔记之GC

    JVM学习笔记二之GC GC即垃圾回收,在C++中垃圾回收由程序员自己来做,例如可以用free和delete来回收对象.而在Java中,JVM替程序员来执行垃圾回收的工作,下面看看GC的详细原理和执行 ...

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

随机推荐

  1. Ajax 与 Struts 1

    Xml配置 <action path="/product/product/validateCurrencyDecimalSupport" type="com.neu ...

  2. Java HdAcm1174

    空间一般直线的方程是:(x-x0)/a=(y-y0)/b=(z-z0)/c,这是一条过(x0,y0,z0),方向矢量为{a,b,c}的直线.假设已知点的坐标是A(e,f,g),过A点,且与{a,b,c ...

  3. FXGL游戏开发-JavaFX游戏框架

    FXGL 是一个JavaFX 游戏开发的框架,这个框架有两个版本,其中基于JDK1.8的版本已经不再维护,目前最新的是基于JDK11的版本,也就是Openjfx的版本. FXGL 提供了各种游戏范例: ...

  4. tomcat过滤器异常

    Connected to server[2019-11-25 04:40:58,976] Artifact DUBBO_BG:Web exploded: Artifact is being deplo ...

  5. unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source 解决办法

    Project -> Properties -> C/C++ -> Precompiled Headers -> Precompiled Header -> 选择Not ...

  6. 小程序使用 lodash 的问题

    import _ from 'lodash' 报错: vendor.js:11874 Uncaught TypeError: Cannot read property 'prototype' of u ...

  7. 常用ADB命令汇总

    网络连接 通过TCP/IP连接设备 adb connect <ip:port> 断开已有的TCP/IP连接 adb disconnect <ip:port> 监听设备上指定的端 ...

  8. 菜鸟入门Linux之路(方法论浅谈)

    Linux是为人熟知的OS之王,已"统治"世界.要想学好绝非易事. 作为菜鸟,可以与Linux亲密接触的方法很多,如视频.书籍.各种企培资料等等,如今的在线教育也如火如荼. 总结说 ...

  9. junit4 套件测试

    junit4 中的套件可以用来测试一个需要依赖的业务流程,如购买必须依赖与登录成功 代码实现: 测试数据存放 public class BaseTest { protected static Hash ...

  10. GC-优化-案例

    优化案例 Service S 优化 现在看一下执行jstat -gcutil的结果 S0 S1 E O P YGC YGCT FGC FGCT GCT 12.16 0.00 5.18 63.78 20 ...