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.每种垃圾回收器的着重点是什么 前边的 ...
随机推荐
- 【ABAQUS2023-Output Vars】使用记录
计算结构的应变能,ALLSE=所有单元的ESEDEN*EVOL.但这不适用于模态分析,因为模态分析EVOL不能用 ALLSE Field: no History: yes .fil: automati ...
- VScode美化
RESULT:EVA-初号机 配色 主题效果 1. 需要的东西 vs code background 插件 custom CSS and JS loader 插件 一些png素材,推荐网址: http ...
- QSound、QSoundEffect播放WAV音频
QSound.QSoundEffect播放WAV音频 本文旨在介绍QSound.QSoundEffect的简单播放音频的方法以及对这两个类的一些基本介绍 文章目录 QSound.QSoundEffec ...
- Keil中设置显示空白符,并将Tab键使用4个空格代替
前言 Keil 的默认设置是没有将 Tab 键使用空格代替的,不同的文本编辑器对 Tab 键所占的空格数不同,有占 2 个空格的,也有占 4 个空格的,这就导致同样的代码在不同的编辑器中缩进不同,虽不 ...
- Vue3 值得注意的新特性
Vue3 值得注意的新特性 Vue3 新特性介绍 片段 组合式 API 单文件组件组合式 API 语法糖 (<script setup>) Teleport Suspense 实验性 SF ...
- go gin web服务器使用fvbock/endless优雅地重启或停止
gin使用fvbock/endless gin 正常使用注册路由时: package main import "github.com/gin-gonic/gin" func mai ...
- Mac 干净彻底地卸载 MySQL
前言 卸载MySQL,首先得知道MySQL的路径.默认的话是在/usr/local文件夹下的. 在系统偏好设置面板中可以看到之前安装的MySQL,此时若想卸载MySQL,可以按照如下步骤来. 之前安装 ...
- go math/rand包详解
go math/rand package rand import "math/rand" rand包实现了伪随机数生成器. math_rand go官方标准文档 随机数从资源生成. ...
- Opencv环境配置一览
OpenCV环境配置一览 专业相关,平时经常会使用到opencv的一些函数,目前主要包括Ubuntu系统,Android系统,本篇文章介绍在两个系统下对应的环境配置策略. Ubuntu环境 附上一个很 ...
- VSCode 终端中文乱码解决方案
问题描述 以下为一个简单的 c++ 文件代码,注意中文部分的显示内容 //测试代码 #include <stdio.h> int main() { int y = 10; int coun ...