Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JVM垃圾收集器(GC)有哪些?

JVM垃圾收集器(GC)有哪些?

作者头像
逍遥壮士
发布于 2021-07-05 11:07:54
发布于 2021-07-05 11:07:54
83700
代码可运行
举报
文章被收录于专栏:技术趋势技术趋势
运行总次数:0
代码可运行

点击上方「蓝字」关注我们

上文:JVM执行引擎(Execution Engine)


什么是垃圾?

对于jvm来说垃圾是指运行程序中没有任何指针指向的对象,这个对象就需要被回收。

个人理解:对于个人所需来说,比如你家里拆快递盒子,用过后,你一直不用,要及时清除,要不然很容易把房间堆满,那这样的话后面的放不进去物品了。

为什么需要GC?

对于高级语言来讲,因为不断的创建对象,如果不清理,迟早内存会满。所以需要清理不要的垃圾。这个有点类型你家里有一间储存物品的杂货间,如果一直往里面塞东西而又不梳理,迟早有一天会被塞满的。

什么是垃圾收集器GC?

垃圾收集器全称:Garbage Collection,下文简称GC,其实就是各种垃圾算法的一种实现。目前还没有符合所有场景的收集器出现。

并行和并发的区别?

并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行。而垃圾收集程序运行在另一个CPU上。

有哪些垃圾收集器?

串行垃圾回收器(Serial)

JVM第一个垃圾收集器,JDK 1.3.1之前都是有这个收集器。可以作用新生代和老年代。

算法:新生代-使用复制算法,老年代-使用标记-整理算法。

特点:串行单线程、不支持并发、会导致"stop the world"。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//配置如下使用
 -XX:+UseSerialGC

并发垃圾回收器(parNew)

为了解决 serial拉圾收集器引起的停机问题,在serial基础上开发了多线程版本,但是parNew是针对client的版本。

特点:多线程、唯一能够与cms搭配使用的收集器;

算法:年轻代采用复制算法、年老代采用标记-整理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//强制指定使用ParNew;
 -XX:+UseParNewGC
//指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;
-XX:ParallerGCThreads

并行垃圾收集器(Parallel Scavenge)

Parallel Scavenge是后个多线程新生代收集器,使用的算法是复制算法。实现方式是当垃圾达到一个可控制的吞吐量(Throughput)则启动垃圾回收。

特点:作用于新生代、老年代由Serial搭配使用,可以有效的减少停顿时间提升用户体验。

算法:新生代复制算法,老年代标记整理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//注意:启动后不需要手工指定新生代的大小(-Xmn)、Eden和Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了
-XX:+UseAdaptiveSizePolicy
//使用Parallel收集器+老年代串行 
-XX:+UseParallelGC 
//启用并行压缩 
-XX:+UseParallelOldGC。

并发垃圾回收器 CMS(Concurrent Mark Sweep)

cms主要是解决停顿时间的问题而开发的一种,低停顿、并发收集器,基于标记清除,可以作用于新生代和老年代。

CMS收集器的运行过程分为下列4步:

初始标记:标记GC Roots能直接到的对象。速度很快但是仍存在Stop The World问题。

并发标记:进行GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行。

重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在Stop The World问题。

并发清除:对标记的对象进行清除回收。

特点:作用于新生代、老年代、代停顿、并发收集;

算法:标记-清除;

缺点:无法处理浮动垃圾、对CPU资源非常敏感、会造成空间碎片化;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:+UseConcMarkSweepGC
//设定CMS的线程数量 
-XX:ParallelCMSThreads

G1垃圾回收器(G1)

特点:作用于新生代、老年代、空间连续减少垃圾碎片、缩小回收范围减少全局停顿、并发收集;

算法:分区算法;

缺点:无法处理浮动垃圾、对CPU资源非常敏感、会造成空间碎片化;

G1收集器的阶段分以下几个步骤:

1、初始标记(它标记了从GC Root开始直接可达的对象);

2、并发标记(从GC Roots开始对堆中对象进行可达性分析,找出存活对象);

3、最终标记(标记那些在并发标记阶段发生变化的对象,将被回收);

4、筛选回收(首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region)。

//启用G1垃圾回收器 -XX:+UseG1GC

查看jdk所用内存垃圾回收器

通过命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java   -XX:+PrintCommandLineFlags -version

堆大小的计算?

初始堆大小

memory / DefaultInitialRAMFraction

memory / 64

最大堆大小

MIN(memory / DefaultMaxRAMFraction, 1GB)

MIN(memory / 4, 1GB)

在JDK8默认的配置下使用 新生代,老年代的垃圾回收策略,新生代区域使用标记-复制算法,老年代区域使用标记-整理算法。

收集器

类型

区域

算法

特性

场景

Seial

串行

新生代

复制算法

响应速度优化

单CPU环境下的Client模式

Serial Old

串行

老年代

标记-整理

响应速度优化

单CPU环境下的Client模式、CMS的后备预案

ParNew

并行

新生代

复制算法

响应速度优先

多CPU环境时在Server模式下与CMS配合

Parallel Scavenge

并行

新生代

复制算法

吞吐量优先

后台运算不需要太多交互任务

Parallel Scavenge old

并行

老年代

标记整理

吞吐量优先

后台运算不需要太多交互任务

CMS

并发

老年代

标记清除

响应速度优先

主要用于互联网站或B/S系统服务端上的Java应用

G1

并发

新生代/老年代

标记-整理+复制算法

响应速度优先

面向服务端应用,将来替换CMS

新生代收集器:Serial、ParNew、Parallel Scavenge

老年代收集器:CMS、Serial Old、Parallel Old

整堆收集器:G1

GC的参数整理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
-XX:NewRatio:新生代和老年代的比
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :在新生代使用并行回收收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收

最后

jvm的垃圾收集器主要作用于新生代和老年代,不同的版本和不同的收集群可以针对不同的场景需要,并不意味的最新就是最好的,有时候在架构和业务层面考虑,可以根据需要进行配置,当然本文仅介绍垃圾收集器,具体里面的算法,由下文再继续深入。

参考文章:

https://blog.51cto.com/u_6877873/1743686

https://www.oracle.com/java/technologies/javase/gc-tuning-6.html

https://www.cnblogs.com/chenpt/p/9803298.html

https://zhuanlan.zhihu.com/p/58896619

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM-垃圾收集器
本篇主要介绍一下JVM的几种垃圾收集器。其示意图如下所示,上面的三个是新生代的收集器, 下面三个是老年代的收集器,其中G1收集器是可以用于新生代和老年代的收集工作。 JVM垃圾收集器 1、Serial
小小科
2018/05/02
5180
JVM-垃圾收集器
JVM垃圾收集器总结
1、是一个单线程的收集器,“Stop The World” 2、对于运行在Client模式下的虚拟机来说是一个很好的选择 4、简单而高效
神秘的寇先森
2019/04/17
3990
JVM垃圾收集器总结
垃圾收集器总结
垃圾收集器总结 常用垃圾收集器对比 垃圾收集器 串行/并行/并发 新生代/老年代 算法 目标 适用场景 Serial 串行 新生代 复制 低延迟优先 单 CPU 环境下的 Client 模式 Serial Old 串行 老年代 标记-整理 低延迟优先 单 CPU 环境下的 Client 模式、CMS 的后备预案 Parllel Scavenge 并行 新生代 复制 吞吐量优先 在后台运算而不需要太多交互的业务 Parallel Old 并行 老年代 标记-整理 吞吐量优先 在后台运算而不需要太多交互的业务
张申傲
2021/12/07
3490
JVM垃圾收集
目录 内存区域回顾 机制介绍 收集器介绍 调优 内存区域回顾 垃圾回收机制 Java 对象生命周期 根搜索算法 从GC Roots对象为起点,开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC
囚兔
2018/02/08
8020
JVM垃圾收集
深入理解JVM(五)——HotSpot垃圾收集器详解
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器。我们可以根据自己实际的应用需求选择最适合的垃圾收集器。 根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率。 新生代垃圾收集器 1. Serial垃圾收集器 单线程 只开启一条GC线程进行垃圾回收,并且在垃圾回收过程中停止一切用户线程,从而用户的请求或图形化界面会出现卡顿。 适合客户端应用 一般客户端应用所需内存较小,不会创建太多的对象,而且堆
大闲人柴毛毛
2018/03/09
9430
深入浅出java虚拟机系列:(三)jvm常用垃圾收集器
上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。
爱笑的架构师
2020/09/24
2820
深入浅出java虚拟机系列:(三)jvm常用垃圾收集器
JVM学习记录-垃圾收集器
先回顾一下上一篇介绍的JVM中常见几种垃圾收集算法: 标记-清除算法(Mark-Sweep)。 复制算法(Copying)。 标记整理算法(Mark-Compact)。 分代收集算法(Generati
纪莫
2018/07/06
3630
JVM之垃圾收集器
因为新生代和老年代采用回收算法的不同,垃圾收集器相应地也分为新生代收集器和老年代收集器。其中新生代收集器主要有Serial收集器、ParNew收集器和Parallel Scavenge收集器。老年代收集器主要有Serial Old收集器、Parallel Old收集器和CMS收集器。当然还包括了一款全新的、新生代老年代通用的G1收集器。各款收集器的搭配使用如下图所示,其中有连线的代表收集器可以搭配使用,没有连线的收集器表示不能搭配使用。
黑洞代码
2021/01/14
4490
JVM之垃圾收集器
JVM垃圾收集器详解
一个单线程的收集器,使用复制算法。它只会使用一条线程工作,并且在进行垃圾收集的同时,必须暂停其他所有的工作线程(Stop The Word),直到垃圾收集结束。
Java学习录
2019/05/15
4070
10. 系统分析垃圾收集器
垃圾收集常用的算法有三种。标记-清除算法,标记-复制算法,标记-整理算法。下面一个一个来看:
用户7798898
2021/10/25
5010
10. 系统分析垃圾收集器
JVM中各个垃圾收集器的使用场景
在以往的文章中(垃圾收集算法),我们讲述了JVM中垃圾收集算法,像标记-清除、标记-整理、复制、分代等算法,这些只是垃圾收集的方法论,今天要介绍的就是垃圾收集的具体实现---垃圾收集器。
用户1212940
2022/04/13
3580
JVM中各个垃圾收集器的使用场景
深入浅出JVM(十五)之垃圾收集器(上篇)
这里推荐一篇从Java并发修改异常相关的文章:如何在代码中优雅的处理 ConcurrentModificationException 并发修改异常是Java集合框架中快速失败机制会抛出的异常,文章提供迭代器、stream流、加锁等多种方式的解决方案,帮助我们找到最佳实践
菜菜的后端私房菜
2024/11/29
4240
图解常见 GC 算法和垃圾收集器
垃圾收集(Garbage Collection) 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的
CoderJed
2018/09/13
3.1K0
图解常见 GC 算法和垃圾收集器
JVM - 再聊GC垃圾收集算法及垃圾收集器
当前虚拟机的垃圾收集都采用分代收集算法 , 意思就是根据对象存活周期的不同将 java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。
小小工匠
2021/08/17
3450
GC算法、垃圾收集器
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
IT技术小咖
2019/11/24
3130
GC垃圾收集器之美
Java最早做了垃圾回收机制,也就是我们说的GC,jvm通过垃圾回收机器,也随着jdk版本的迭代,不断的再进步。
Joseph_青椒
2023/08/05
4770
GC垃圾收集器之美
【JVM进阶之路】七:垃圾收集器盘点
在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法。接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的实现。
三分恶
2021/04/01
6500
【JVM进阶之路】七:垃圾收集器盘点
JVM垃圾收集—垃圾收集器及常见组合参数
串行收集器 Serial 和 Serial Old 只能有一个垃圾回收线程执行,用户线程暂停。(适用于内存较小的嵌入式设备)
向着百万年薪努力的小赵
2022/12/02
6400
JVM垃圾收集—垃圾收集器及常见组合参数
HotSpot 垃圾收集器
HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。
用户10638916
2023/07/01
1680
HotSpot 垃圾收集器
JVM之垃圾回收-垃圾收集器
如果说前面介绍的收集算法(JVM之垃圾回收-垃圾收集算法)是内存回收的抽象策略,那么垃圾收集器就是内存回收的具体实现。
谙忆
2021/01/21
5900
JVM之垃圾回收-垃圾收集器
相关推荐
JVM-垃圾收集器
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文