当前位置: 首页 > news >正文

JVM系列(十) -垃圾收集器介绍

一、摘要

在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。

今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。

二、垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。

不同的虚拟机所提供的垃圾收集器可能会有很大差异,以 HotSpot 虚拟机为例,所包含的垃圾收集器可以用如下图来概括。

上图中的连线表示,不同分代的收集器可以搭配使用。

  • 新生代收集器:Serial、ParNew、Parallel Scavenge
  • 老年代收集器:Serial Old、CMS、Parallel Old
  • 通用收集器: G1

在虚拟机中,没有所谓的万能收集器,只有根据具体的业务场景,选择最合适的收集器。这也是为什么 HotSpot 实现了这么多收集器的原因。

下面我们一起来看看相关的具体实现。

2.1、Serial 和 Serial Old收集器

Serial 系列的垃圾收集器是 JVM 的第一款收集器,它的设计思路很简单,在新生代,使用单线程采用复制算法进行收集对象;在老年代,使用单线程采用标记整理算法进行收集对象;垃圾收集的过程中会暂停用户线程,直到垃圾收集完毕。

因为当时的硬件环境配置都不高,内存都是几十兆,CPU 也都是单核的,不像现在这样处处都是高并发的应用场景。限于当时的硬件资源和应用场景,这个收集器优势很突出,简单高效、消耗资源也很少。

唯一的不足在于,在用户不可见的情况下要把用户正常工作的线程全部停掉,这对很多应用比较难以接受。不过实际上到目前为止,Serial 收集器依然是虚拟机在 Client 模式下运行的默认新生代收集器,因为它简单而高效。客户端应用模型下,分配给虚拟机管理的内存一般来说不会很大,收集几十兆甚至一两百兆的新生代对象,停顿时间平均在几十毫秒,只要不是频繁收集,完全可以接受。

整个流程,可以用如下图来概括。

总结下来,收集器特点如下:

  • 收集区域: Serial(新生代),Serial Old(老年代)
  • 收集算法: Serial(复制算法),Serial Old(标记整理算法)
  • 收集方式:单线程
  • 优势:简单高效,内存资源占用少,单核 CPU 环境最佳选项
  • 劣势:整个搜集过程需要停顿用户线程,多核 CPU、大内存的环境,资源优势无法发挥起来
2.2、ParNew收集器

ParNew 收集器,可以看成是 Serial 收集器的多线程版本。除了使用多线程进行垃圾收集外,其余行为和 Serial 收集器完全一样,包括使用的也是复制算法,垃圾收集时暂停用户线程。在多核 CPU 资源环境下,可以显著提升整个垃圾收集的性能,也是虚拟机在 Server 模式下运行的首选新生代收集器。

能让 ParNew 出名的一个核心因素是,它是除了 Serial 收集器外,目前唯一一个能与 CMS 收集器配合一起使用的新生代收集器,因为 CMS 优秀所以 ParNew 也出名了,有点类似碰上了大款的感觉,其中 CMS 收集器是一款几乎可以认为有划时代意义的垃圾收集器,下文我们再讲。

其次,ParNew 收集器在单个 CPU 的环境中绝对不会有比 Serial 收集器更好的效果,甚至由于线程交互的开销,该收集器在两个 CPU 的环境中都不能百分之百保证可以超越 Serial 收集器。当然,随着可用 CPU 数量的增加,它对于垃圾收集的效率提升还是很有帮助的。

整个流程,可以用如下图来概括。

总结下来,收集器特点如下:

  • 收集区域:新生代
  • 收集算法:复制算法
  • 收集方式:多线程
  • 优势:多线程收集,多核 CP

相关文章:

JVM系列(十) -垃圾收集器介绍

一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…...

项目实战 ---- 商用落地视频搜索系统(9)---UI与上层service的交互优化

目录 背景 第一次优化(UI优化) 优化前UI 优化方向与问题 代码 修改效果 第二次优化(整合优化) 优化方向与问题 代码 优化效果 第三次优化(js层优化) 优化方向与问题 代码 优化效果 第四次优化(UI逻辑再优化) 优化方向与问题 代码 优化效果 第五次优化(纯U…...

媒体服务器软件BUG说明及改进方案

媒体服务器软件BUG说明及改进方案 一、BUG描述二、问题分析三、改进方案四、实施计划五、预期效果六、总结一、BUG描述 在当前版本的媒体服务器中,存在一个关于静音媒体流处理的问题。具体表现为:当主叫连续发送静音帧到媒体服务器时,媒体服务器并未将这些静音帧转发给被叫…...

Gitlab修改已push的历史commit信息

文章目录 一、需求 二、思路 三、修改过程 四、注意 五、参考链接 一、需求 项目组结合使用JIRA和Gitlab进行项目开发。其中,JIRA用于管理开发任务(每个任务都存在一个JIRA_ID),Gitlab用于进行代码版本管理。每次代码提交时,commit mes…...

[Linux入门]---进程替换

文章目录 1.进程替换原理2.进程替换函数2.1execl函数2.2execlp函数2.3execv函数2.4execvp函数2.5execle函数2.6execve函数2.7跨语言调用程序 3.总结 1.进程替换原理 一个程序替换的函数&#xff1a; #include <unistd.h> int execl(const char *path, const char *arg,…...

Java语言程序设计基础篇_编程练习题*18.9 (以逆序输出一个字符串中的字符)

目录 题目&#xff1a;*18.9 (以逆序输出一个字符串中的字符) 代码示例 输出结果 题目&#xff1a;*18.9 (以逆序输出一个字符串中的字符) 编写一个递归方法&#xff0c;使用下面的方法头在控制台上以逆序显示一个字符串: public static void reverseDisplay(String value…...

IT英语每日积累

IT词汇积累 前言今日学习1. be synonymous with2.handle something3.modify4.optionally5. generate6,sandby7.interrupt8.emphasize9.croodinate10.splitting and merging11.shard12.per13.consecutively14.synchronization15。unbounded 前言 这里给出的是本人在生活和学习中…...

QML学习二:Qt启用qml文件实时预览编辑,以及打印日志到控制台

开发环境:Qt 6.5.3 LTS 1、Qt 6.5.3 LTS 2、Pyside6 3、Python 3.11.4 效果如下,右侧更改的代码可以实时反映到左侧的设计器中。 Qt启用qml文件实时预览编辑,以及打印日志到控制台 一、打开Qt Designer插件二、qml和Python文件打印输出到控制台总结Qt Creator版本如下:…...

JVM面试真题总结(四)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 列举常用的垃圾收集器&#xff0c;并简要说明其特点 Serial收集器…...

P1352 没有上司的舞会

~~~~~ P1352 没有上司的舞会 ~~~~~ 总题单链接 思路 ~~~~~ 设 d p [ u ] [ [ 0 / 1 ] dp[u][[0/1] dp[u][[0/1] 表示第 u u u 个点 [ 不选 / 选 ] [不选/选] [不选/选] 的最大值。 ~~~~~ d p [ u ] [ 1 ] dp[u][1] dp[u][1] 只能用 d p [ v ] [ 0 ] dp[v][0] dp[v][0] 来更…...

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来&#xff0c;一站式有声阅读平台听书系统 &#x1f31f; 开篇&#xff1a;遇见未来&#xff0c;从“智听”开始 在这个快节奏的时代&#xff0c;你是否渴望在忙碌的间隙&#xff0c;找到一片属于自己的宁静角落&#xff1f;是否梦想着能随时随地&#xff0c;沉浸在知…...

2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp

EncirclingGame 题目描述&#xff1a;A simple game, enjoy it and get the flag when you complete it. 开题&#xff0c;前端小游戏&#xff0c;红点出不去就行 直接玩通关了 看看如何不玩也能拿到flag&#xff0c;flag存储在后端php文件内&#xff0c;前端找不到。 看一下…...

论文阅读笔记《面向集群协同的两点相对定位技术》

邓廷祥,任鹏,程甲,等.面向集群协同的两点相对定位技术[J].兵工学报,2023,44(S2):22-34. 摘要 无人机精确定位的三个难题&#xff1a; GNSS难以提供稳定准确的位置信息、难以部署辅助锚点、传统的相对定位方法大多存在节点数量限制。 本文针对上述问题&#xff0c;提出了一种GN…...

RK3566/RK3568 Android 11 无操作自动隐藏导航栏、底部上拉显示导航栏

概述 总目录:RK3566/RK3568 Android 11 定制大全 在系统服务中增加无操作自动隐藏导航栏方法,在上层app动态调用无操作自动隐藏导航栏方法,系统会在5秒无操作后自动隐藏导航栏,隐藏导航栏后从底部上拉可显示导航栏,设备关机和重启后也能继续生效。 创建全局变量 1.定义…...

四、Django模型

Model Model (模型) 简而言之即数据模型&#xff0c;是一个Django应用的核心。模型不是数据本身&#xff08;比如数据表里的数据), 而是抽象的描述数据的构成和逻辑关系。 每个Django的模型(model)实际上是个类&#xff0c;继承了models.Model。每个Model应该包括属性(字段)&…...

Telephony SS

1、补充业务概述 SS是补充服务的缩写,它包含呼叫转移、呼叫限制、呼叫等待、线路识别(CLIR)等。在IMS(IP多媒体子系统)网络中,它使用XCAP(XML配置访问协议)协议通过UT接口操纵SS数据。该协议允许授权用户在连接到IMS或连接到非IMS网络(例如公共互联网)时操纵与服务相…...

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h> #include <stdlib.h> void shellSort(int data[], int n){// 划分的数组&#xff0c;例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量&#xff0c;换值int temp;…...

C++(一)----C++基础

1.C的发展史 C语言诞生后&#xff0c;很快普及使用&#xff0c;但是随着编程规模增大且越来越复杂&#xff0c;并且需要高度的抽象和建模时&#xff0c;C语言的诸多短板便表现了出来&#xff0c;为了解决软件危机&#xff0c;上世纪八十年代&#xff0c;计算机界提出了oop&…...

C 语言面试题大汇总之华为面试题

文章目录 1. 局部变量能否和全局变量重名?2. 如何引用一个已经定义过的全局变量?3. 全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?4. 请写出下列代码的输出内容5. static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么区别?s…...

Java:面向对象

继承 继承是一种面向对象编程&#xff08;OOP&#xff09;特性&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff08;称为父类或基类&#xff09;的属性&#xff08;如方法和字段&#xff09;。通过继承&#xff0c;子类可以复用父类的代…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...