上面有7类垃圾回收器,分为两块,上面为新生代(Young generation)回收器,下面是老年代(Tenured generation)回收器。如果两个回收器之间存在连线,就说明它们可以搭配使用。

  • GC主要分二类:新生代GC和老年代GC;
  • 新生代GC包括:串行GC、并行GC、并行回收GC;
  • 老年代GC包括:老年代串行GC、老年代并行GC、CMS;
  • G1比较特殊,同时支持新生代和老年代。
1、Serial回收器(串行GC)

  它是一个新生代回收器,单线程执行,使用复制算法。它在进行垃圾回收时,必须暂停其它所有的工作线程(用户线程)。是JVM client模式下默认的新生代回收器。对于限定单个CPU的环境来说,Serial回收器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程回收效率。温馨提示,它进行垃圾收集时,必须暂停其它所有的工作线程(Stop-The-World:将用户正常工作的线程全部暂停掉),直到它收集结束。

2、ParNew回收器(并行GC)

  并行GC是Serial回收器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial回收器一样。

  它是运行在server模式下的首选新生代回收器,除了串行GC外,目前只有它能与CMS回收器配合工作。CMS回收器是一个被认为具有划时代意义的并发回收器,因此如果有一个垃圾回收器能和它一起搭配使用让其更加完美,那这个回收器必然也是一个不可或缺的部分了。

3、Parallel Scavenge回收器(并行回收GC)

  scavenge [ˈskævɪndʒ] 清除污物,打扫。并行GC的plus版,更加关注吞吐量。目标是达到一个可控制吞吐量的回收器。

  并行回收GC也是一个新生代回收器,它也是使用复制算法的回收器,又是并行多线程回收器。

  停顿时间和吞吐量不可能同时调优。我们一方买希望停顿时间少,另外一方面希望吞吐量高,其实这是矛盾的。因为:在GC的时候,垃圾回收的工作总量是不变的,如果将停顿时间减少,那频率就会提高;既然频率提高了,说明就会频繁的进行GC,那吞吐量就会减少,性能就会降低。

  吞吐量:CPU用于用户代码的时间/CPU总消耗时间的比值,即=运行用户代码的时间/(运行用户代码时间+垃圾收集时间)。比如,虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

  jdk8中,JVM使用的默认的垃圾回收器是UseParallelGC,即新生代并行回收GC和老年代(Ps MarkSweep)组合。

4、Serial Old回收器(老年代串行GC)

  Serial Old是Serial回收器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。

5、Parallel Old回收器(老年代并行GC)

  老年代并行GC是并行GC的老年代版本,使用多线程和标记-整理算法。

6、G1回收器

  G1(Garbage First)回收器是当今回收器发展的最前沿成果之一,自JDK 7提供的一个新回收器,基于“标记-整理”算法实现,故不会产生内存碎片。还有一个特点之前的回收器进行收集的范围都是整个新生代或老年代,而G1将收集整个Java堆(包括新生代,老年代)。

  充分利用多CPU、多核环境下的硬件优势来缩短垃圾收集的停顿时间。G1 回收器是针对性地对Java堆内存区域进行垃圾收集,而非每次都对整个 Java 堆内存区域进行垃圾收集。

  使用的垃圾收集算法:

  • 对于新生代:复制算法;
  • 对于老年代:标记 - 整理算法。
7、CMS回收器(并发GC)

  CMS回收器(Concurrent Mark Sweep:并发标记清除)基于标记-清除算法,是一种以获取最短回收停顿时间为目标的回收器。适合应用在互联网或者B/S系统的服务器上,这类应用尤其重视服务器的响应速度,希望系统停顿时间最短。

  CMS回收器的优点:并发收集、低停顿,但是CMS还远远达不到完美。

  三个显著缺点:

  • CMS回收器对CPU资源非常敏感。在并发阶段,虽然不会导致用户线程停顿,但是会占用CPU资源而导致引用程序变慢,总吞吐量下降。CMS默认启动的回收线程数是:(CPU数量+3) / 4。
  • CMS回收器无法处理浮动垃圾。
  • 会产生大量碎片。
Reference

Java虚拟机之垃圾回收器的更多相关文章

  1. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  2. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  3. java虚拟机之垃圾回收算法

    标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...

  4. java虚拟机 之 垃圾回收机制

    一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...

  5. Java 虚拟机的垃圾回收

    背景 垃圾收集(Garbage Collection,GC),GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. 对于Java来说,运行时区域 ...

  6. 了解java虚拟机—串行回收器(6)

    串行回收器 串行回收器只有一个工作线程,串行回收器可以在新生代和老年代使用,根据作用于不同的堆和空间,分为新生代串行回收器和老年代串行回收器. 1.新生代串行回收器 串行收集器是所有垃圾回收器中最古老 ...

  7. 【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法

    在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间.内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿是透明的.就是解放了程序猿手动回收内存的 ...

  8. java虚拟机之垃圾回收机制

    一.需要回收的内存区域     程序计数器.虚拟机栈.本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.而 Java 堆和方法区则不一 ...

  9. 深入理解Java虚拟机(三)——垃圾回收策略

    所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...

  10. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

随机推荐

  1. Windows编程----进程:命令行参数

    什么是进程的命令行参数 每个进程在启动(双击exe启动.cmd命令行启动或者由其他程序通过CreateProcess启动)的时候,都会有一个命令行参数给它.命令行的参数以空格区分.这个命令行总是不为空 ...

  2. abaqus&FEA资料-科研&工具-导航

    复合材料力学 BLOGs上的书籍共享文件夹 2004-Mechanics of Composite Structural Elements.pdf,onedrive link Mechanics Of ...

  3. Redis压测脚本及持久化机制

    Redis压测脚本及持久化机制 Redis性能压测脚本 Redis的所有数据是保存在内存当中的,得益于内存高效的读写性能,Redis的性能是非常强悍的.但是,内存的缺点是断电即丢失,所以,在实际项目中 ...

  4. python 将字典转换为列表

    在实现功能时,有时候有些函数适用于非字典形式 这时候就需要把字典转换为其他形式 本例主要讲解字典到列表转换 datas=[{'1':'nihao'},{'2':'very goog'}] to_lis ...

  5. Windows 提权-服务_DLL 劫持

    本文通过 Google 翻译 DLL Hijacking – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. ...

  6. 密码加密|jsencrypt|md5|加密解密的两种方式

    一.md5 npm install md5 二.JSEncrypt 2.1 介绍 JSEncrypt属于RSA加密,RSA加密算法是一种非对称加密算法: 2.2 使用 安装: npm install ...

  7. Windows 鼠标右键失效

    突然有一天...小邋遢他变了... 哦不是...鼠标右键/键盘菜单键莫名其妙失效了. 解决办法 运行 regedit 打开注册表编辑器 依次展开 HKEY_CURRENT_USER\Software\ ...

  8. 微信 dat 文件还 荐

    前言 以微信 PC 端为例 某个小姐姐/小哥哥通过微信发给你的图片会在以下目录以 .dat 后缀的格式出现 C:\Users\taadis\Documents\WeChat Files\taadis\ ...

  9. 经过几天的努力Biwen.AutoClassGen终于实现了DTO复杂属性的生成

    前言 距写上一篇 https://www.cnblogs.com/vipwan/p/18535459 生成DTO已经有一段时间了, 最初没有考虑复杂二级属性嵌套的实现,而是直接使用排除使用自定义的方式 ...

  10. C#使用Blazor编译WebAssembly供前端调用(一),关于SkiaSharp相关问题

    目前信创热潮开始掀起,而C#很多行业开发的都是桌面端,迁移到网页端常常会因为很多库不支持或者不友好导致项目一直卡着. 最近一直在网上找灵感,偶然发现Web Assembly,一开始我还没不知道这是什么 ...