Java虚拟机之垃圾回收器
上面有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虚拟机之垃圾回收器的更多相关文章
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- java虚拟机之垃圾回收算法
标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...
- java虚拟机 之 垃圾回收机制
一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...
- Java 虚拟机的垃圾回收
背景 垃圾收集(Garbage Collection,GC),GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. 对于Java来说,运行时区域 ...
- 了解java虚拟机—串行回收器(6)
串行回收器 串行回收器只有一个工作线程,串行回收器可以在新生代和老年代使用,根据作用于不同的堆和空间,分为新生代串行回收器和老年代串行回收器. 1.新生代串行回收器 串行收集器是所有垃圾回收器中最古老 ...
- 【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法
在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间.内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿是透明的.就是解放了程序猿手动回收内存的 ...
- java虚拟机之垃圾回收机制
一.需要回收的内存区域 程序计数器.虚拟机栈.本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.而 Java 堆和方法区则不一 ...
- 深入理解Java虚拟机(三)——垃圾回收策略
所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
随机推荐
- 【目标检测】二、Fast R-CNN与SVD
1.流程 (1) 空间金字塔池化(spatial pyramid pooling,SPP) 原理: (2)Fast-RCNN 2.数学概念 这么多个全连接层,必然存在计算的性能问题,让数学家们蠢蠢欲动 ...
- PPT 技巧&网站
样机生成网站 https://mockuphone.com/device?type=computer CTROL+L 演示生成荧光笔 3.如何内嵌字体 文件->选项->保存->勾选潜 ...
- k8s dashboard token 生成/获取
创建示例用户 在本指南中,我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户.授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板. 对于以下每个和的代码片段ServiceAcc ...
- k8s node节点报错 dial tcp 127.0.0.1:8080: connect: connection refused
前言 在搭建好 kubernetes 环境后,master 节点拥有 control-plane 权限,可以正常使用 kubectl. 但其他 node 节点无法使用 kubectl 命令,即使同步过 ...
- VLAN聚合技术:Super-vlan
Super-VLAN,也称为VLAN聚合(VLAN Aggregation),是一种网络配置技术,主要用于优化IP地址资源的利用和隔离广播域. 一.定义与功能 Super-VLAN是通过将多个VLAN ...
- ISO9126
ISO9126 软件质量模型是评价软件质量的国际标准,由6个特性和27个子特性组成. 中文名 软件质量模型 外文名 ISO9126 属 于 软件产品评价-质量特性 层 次 质量特性 ...
- Windows 提权-服务_弱注册表权限
本文通过 Google 翻译 Weak Registry Key Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭 ...
- Linux性能分析-平均负载
平均负载的理解 一般系统变慢时,我们会使用top或uptime命令来查看下系统的负载情况 [root@localhost shell]# uptime 13:51:08 up 5 days, 21:5 ...
- 使用 PHP cURL 实现 HTTP 请求类
类结构 创建一个 HttpRequest 类,其中包括初始化 cURL 的方法.不同类型的 HTTP 请求方法,以及一些用于处理响应头和解析响应内容的辅助方法. 初始化 cURL 首先,创建一个私有方 ...
- 基于C#的学生社团管理系统(简单基础版)
前言 该系统为个人独立编写测试,也算自己的孩子吧,虽然基础功能简单但是也为了大家能有个可以借鉴,可以改写的模版使用,我就写个博客让大家参考,但是拒绝搬运售卖. * 正式介绍 该系统基于C#开发,使用V ...