JVM(Java Virtual Machine)垃圾收集器篇

news2024/11/17 15:56:17

前言

本文参考《深入理解Java虚拟机》一书,本文主要介绍几个经典的垃圾收集器:Serial、ParNew、parallelScavenge、CMS、Serial Old、Parallel Old、G1

本系列其他文章链接:
JVM(Java Virtual Machine)内存模型篇
JVM(Java Virtual Machine)垃圾收集算法篇

垃圾收集器

如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。下图展示了7种不同的分点收集器,如果两个收集器之间存在连线,就说明它们之间可以搭配使用,图中收集器所处的区域,则表示他是属于新生代收集器抑或是老年代收集器。
在这里插入图片描述

新生代收集器

Serial

Serial收集器可以说是远古时期的收集器,它是一个单线程、标记-复制算法收集器,,但它的“单线程”不仅仅是指只会使用一个处理器或一条收集线程去处理垃圾收集工作,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束

暂停其他线程被称为:“STW(Stop the world)”,对于STW,就像你在房间里干大事,你老妈要进来打扫卫生,你也得乖乖到某个地方暂时待着等她收拾完

下图是Serial/Serial Old收集器运行过程:
在这里插入图片描述
Serial收集器在单核或者核心数比较少的系统中,Serial收集集由于没有线程交换的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。


ParNew

ParNew收集器实质上是Serial的多线程并行版本。除了是使用多线程收集垃圾外,其他收集算法、控制参数、STW、对象分配规则、回收策略等都和Serial一样。下图是ParNew/Serial Old的收集运行图:
在这里插入图片描述

ParNew默认开启线程数与处理器核心数量相同

ParNew 是一个低延迟、标记-复制算法的垃圾收集器,与后面会介绍的CMS收集器属于同一个类型,所以ParNew和CMS是可以互相搭配使用的,但是对于CMS来说,只有ParNew或者Serial能与它一起工作,其它收集器都不行。


Parallel Scavenge

Parallel Scavenge收集器也是一款新生代、并行、标记-复制算法的收集器,相比于其他垃圾收集器关注低延时,这款关注的是 “吞吐量”
在这里插入图片描述
如果虚拟机完成某个任务,用户代码+垃圾收集 == 100分钟,其中垃圾收集花掉1分钟,那么吞吐量就是99%。

低延时: 适合于用户交互或者需要保证服务响应质量的程序,良好的响应可以提升用户体验。
高吞吐: 可以高效率地利用处理器资源,尽快完成程序的运算任务,主要适合后台运算而不太需要太多交互的分析任务

所以由于定位不同,Parallel Scavenge无法和追求低延时的垃圾收集器合作

老年代收集器

Serial Old

Serial Old收集器是Serial的老年代版本,收集算法上使用的是标记-整理算法。
在这里插入图片描述
当然他也可以和Parallel Scavenge一起使用,除此之外,它也是CMS的备用方案,当CMS回收失败的时候,就需要启动Serial Old来进行垃圾收集了。


Parallel Old

Parallel Old是Parallel Scavenge的老年代版本,自然也是以吞吐量为目标,使用的是标记-整理算法。Parallel Scavenge/Parallel Old的收集流程
在这里插入图片描述


CMS

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,这个算法是使用的标记-清理算法

它的运作过程稍微复杂一点,包括下面四个步骤:

  • 初始标记(CMS initial mark)
  • 并发标记(CMS concurrent mark)
  • 重新标记(CMS remark)
  • 并发清除(CMS concurrent sweep)

其中初始标记重新标记这两个步骤还是会经历STW,但是时间非常短

  • 初始标记:仅仅是为了标记一下“GC Roots”能直接关联到对象”
  • 并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程
  • 重新标记:为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的一步分对象进行标记记录
  • 并发清理:清理删除掉标记阶段判断的以及死亡的对象,由于不需要移动存活对象,所以这个阶段也是与用户线程并发的。

下图为收集过程图:
在这里插入图片描述
CMS虽然并不会导致用户线程的停顿,但却也会一定程度上降低应用程序效率,毕竟也分配一部分资源出去了。默认的CMS默认启动的回收线程数是(处理器核心数量+3)/4。

为了高效率,自然有会在内存空间上有所牺牲,CMS无法处理“浮动垃圾”,也就是在并发标记和并发清理的过程中产生的新垃圾,这些垃圾只能留到下一次老年代发生垃圾收集才能被回收。除此之外,CMS使用标记-清理算法也会导致内存碎片问题。

因此CMS收集器就必须为老年代预留一些空间来暂时存放这些“浮动垃圾”,当CMS运行期间预留的内存无法满足程序分配新对象,就会出现以一次“并发失败”,这时候就会使用上面提到的Serial Old这个备用方案,对老年代进行一次彻底的清理,且将内存碎片问题解决。(Serial Old为标记整理算法,CMS为标记清理算法)

虽然如此弊端,但是不影响CMS是一款优秀的垃圾收集器,是目前任然应用在大多数基于浏览器B/S系统的服务端上。


G1收集器

如果要讲述这个收集器篇幅过大,将来有时间再补上(并非偷懒T_T)


END
希望本文能对你有帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2434: 【区赛】[慈溪2013]统计方格

题目描述 给出一张 n 行 m 列仅由黑白方格组成的黑白图片(行从上到下 1 到 n 编号,列从左到右 1 到 m 编号)。如下图是一张由 17 行 18 列方格构成的黑白图片,图片中的任意一个方格要么是白色,要么是黑色。 仔细观察这…

介绍Sigmoid函数的平移、平滑和翻转【基于Python可视化分析】

文章目录 简介Sigmoid函数Sigmoid函数曲线调控参数设置python可视化参考 简介 本篇博客介绍了具有S型曲线的Sigmoid函数,以及如何设置、调整Sigmoid函数的参数实现S曲线的平滑、平移和翻转操作。博客给出了Python代码示例,更加深刻形象。😆&…

hdlbits系列verilog解答(两输入与门)-06

文章目录 wire线网类型介绍一、问题描述二、verilog源码三、仿真结果 wire线网类型介绍 wire线网类型是verilog的一种数据类型,它是一种单向的物理连线。它可以是输入也可以是输出,它与reg寄存器数据类型不同,它不能存储数据,只能…

数据结构与算法 | 第二章:线性表

本文参考网课为 数据结构与算法 1 第二章线性表,主讲人 张铭 、王腾蛟 、赵海燕 、宋国杰 、邹磊 、黄群。 本文使用IDE为 Clion,开发环境 C14。 更新:2023 / 10 / 22 数据结构与算法 | 第二章:线性表 线性表总览线性结构概念特…

大数据技术学习笔记(三)—— Hadoop 的运行模式

目录 1 本地模式2 伪分布式模式3 完全分布式模式3.1 准备3台客户机3.2 同步分发内容3.2.1 分发命令3.2.2 执行分发操作 3.3 集群配置3.3.1 集群部署规划3.3.2 配置文件说明3.3.3 修改配置文件3.3.4 分发配置信息 3.4 SSH无密登录配置3.4.1 配置ssh3.4.2 无密钥配置 3.5 单点启动…

人工智能(6):机器学习基础环境安装与使用

1 库的安装 整个机器学习基础阶段会用到Matplotlib、Numpy、Pandas等库,为了统一版本号在环境中使用,将所有的库及其版本放到了文件requirements.txt当中,然后统一安装 新建一个用于人工智能环境的虚拟环境 mkvirtualenv ai matplotlib3.8…

Mybatis应用场景之动态传参、两字段查询、用户存在性的判断

目录 一、动态传参 1、场景描述 2、实现过程 3、代码测试 二、两字段查询 1、场景描述 2、实现过程 3、代码测试 4、注意点 三、用户存在性的判断 1、场景描述 2、实现过程 3、代码测试 一、动态传参 1、场景描述 在进行数据库查询的时候,需要动态传入…

【源码解析】Spring源码解读-bean的加载

Spring的整体流程其实就是通过配置 xml、注解将自定义bean类信息进行配置,然后通过BeanDefinitionReader读取配置信息,由Dom转换成xml解析成Docment。在通过加载的配置信息进行初始化Bean对象,然后在对象的前后进行处理,也就是不同…

2023-10-22

一、总线通信协议简介 总线是计算机系统中负责连接各个硬件的通信线路,它可以传输数据、地址和控制信号。通信协议是指双方实体完成通信所遵循的规则。总线通信协议是一种规定总线设备之间数据通信方式和方法的规则,它包括数据的通信方式、速率、格式、…

python爬虫之js逆向入门:常用加密算法的逆向和实践

一、强大的Chrome DevTools Chrome DevTools是一组内置于Google Chrome浏览器中的开发者工具,用于帮助开发人员调试、分析和优化Web应用程序。它提供了一系列功能强大的工具,用于检查和编辑HTML、CSS和JavaScript代码,监视网络请求、性能分析…

redis怎么设计一个高性能hash表

问题 redis 怎么解决的hash冲突问题 ?redis 对于扩容rehash有什么优秀的设计? hash 目标是解决hash冲突,那什么是hash冲突呢? 实际上,一个最简单的 Hash 表就是一个数组,数组里的每个元素是一个哈希桶&…

ida81输入密码验证算法分析以及破解思路

本文分析了ida81对输入密码的验证流程,分别对输入密码到生成解密密钥、密码素材的生成过程以及文件数据的加密过程这三个流程进行分析,并尝试找一些可利用的破绽。很遗憾,由于水平有限,目前也只是有个思路未能完全实现&#xff0c…

查看当前cmake版本支持哪些版本的Visual Studio

不同版本的的cmake对Visual Studio的版本支持不同,以下图示展示了如何查看当前安装的cmake支持哪些版本的Visual Studio。 1.打开cmake-gui 2.查看cmake支持哪些版本的Visual Studio

28. 使用 k8e 玩转 kube-vip with Cilium‘s Egress Gateway 特性

因为在私有云环境下,我们需要保障集群服务 APIServer地址的高可用,所以提供的方案就是使用一个 VIP 让 API Server 的流量可以负载均衡的流入集群。另外,kube-vip 还支持 Service LB,方便SVC 服务的负载均衡,结合 cilium Egress Gateway 特性可以做到集群内的容器对外访问…

canvas绘制刮涂层抽奖效果

实现的效果&#xff1a;主要用到画布设置图层覆盖效果globalCompositeOperation属性 实现的源代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"…

canvas常用的几种重叠绘图设置globalCompositeOperation

globalCompositeOperation描述了2个图形交叉的时候是什么样子&#xff0c;它的值有很多&#xff0c;这里就盗一张很经典的图&#xff1a; 我们来看一个source-in的例子吧&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset&q…

论文-分布式-并发控制-Lamport逻辑时钟

目录 前言 逻辑时钟讲解 算法类比为面包店内取号 Lamport算法的时间戳原理 Lamport算法的5个原则 举例说明 算法实现 参考文献 前言 在并发系统中&#xff0c;同步与互斥是实现资源共享的关键Lamport面包店算法作为一种经典的解决并发问题的算法&#xff0c;它的实现原…

VTM/VVC 编译与测试-- YUV与RGB空间转换

环境配置:ubuntu 18.04 一、VVC测试 软件下载: 官网下载 VVC:http://jvet.hhi.fraunhofer.de/ 这里可以选择版本。 编译工具: 在开始编译前,需要电脑的环境中中有gcc、g++、cmake、make这四个工具。 sudo apt-get install gcc g++ sudo apt-get install cmake sudo …

Android微信逆向--实现发朋友圈动态

Android微信逆向--实现发朋友圈动态 0x0 前言# 最近一直在研究Windows逆向的东西&#xff0c;想着快要把Android给遗忘了。所以就想利用工作之余来研究Android相关的技术&#xff0c;来保持对Android热情。调用微信代码来发送朋友圈动态一直是自己想实现的东西&#xff0c;研…

Internet Download Manager 逆向分析

写在前面 文章仅供学习&#xff0c;切勿用于商业用途&#xff0c;出于版权原因&#xff0c;文章不提供资源下载。 论坛上较早之前已经有前辈对IDM的序列号算法进行过逆向分析 以及最近有师傅尝试对本篇文章对象相同的版本进行了逆向分析&#xff0c;但是比较遗憾的是该文章并…