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. Javascript - Vue - 组件

    创建组件 组件是可以重复使用的html容器,可以把它注册到全局的Vue或实例的vue对象上,使它成为全局组件或vue对象的子组件,然后可以将它的html标签插入html文档中.组件的html只能有一个 ...

  2. Java规范化代码eclipse模板注释

    建议下载阿里规范化插件 阿里的new java file的注释模板(Type): /**  * @author ${user}  * @date ${currentDate:date('YYYY/MM ...

  3. SpringCloud升级之路2020.0.x版-24.测试Spring Cloud LoadBalancer

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 通过单元测试,我们 ...

  4. 目录-理解ASP.NET Core

    <理解ASP.NET Core>基于.NET5进行整理,旨在帮助大家能够对ASP.NET Core框架有一个清晰的认识. 目录 [01] Startup [02] Middleware [ ...

  5. Nginx 极简入门教程!(转)

    基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.r ...

  6. java IO操作,看完你应该就清晰了。

    前言: java中IO里的一些知识对于一个java新手来说,是比较难理解的.因为里面存在一些很绕的概念,比如: 1.到底是读入写出,还是读出写入: 2.我要将一个文件的内容拷贝到另一个文件是先用Inp ...

  7. 手动编译部署LNMP环境(CentOS7.5+Nginx-1.18.0+MySQL-5.7.30+PHP-7.4.14)

    在平时运维工作中,经常需要用到LNMP应用框架.LNMP环境是指在Linux系统下,由Nginx + MySQL + PHP组成的网站服务器架构. 可参考前面的文章: 如何在CentOS 7上搭建LA ...

  8. openswan协商流程之(四):main_inI2_outR2()

    主模式第四包:main_inI2_outR2 1. 序言 main_inI2_outR2()函数是ISAKMP协商过程中第四包的核心处理函数的入口,同时在此处理流程中已经获取到足够的隧道信息,可以生成 ...

  9. Request请求对象

    一.Request对象由服务器创建,我们使用 浏览器访问服务器资源原理: 二.Request体系结构 其中,servlet 的service()方法参数列表是 servletRequest对象, Ht ...

  10. 了解HTTP基本知识板块

    一.HTTP 协议概述 HTTP协议采用了请求/响座模型. 客户端向服务器发送-个请求,请求头包含请求的方法.URT..协议版本.以以 及包含请求修饰符.客户信息和内容的类似于MIME的消息结构. 服 ...