简单认识一下HotSpot 垃圾收集器

news2024/11/12 0:13:13

前言

HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,虽然我们要对各个收集器进行比较,但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。

新生代垃圾收集器

Serial 垃圾收集器(单线程)

只开启一条 GC 线程进行垃圾回收,并且在垃圾收集过程中停止一切用户线程,即 Stop The World。

一般客户端应用所需内存较小,不会创建太多对象,而且堆内存不大,因此垃圾收集器回收时间短,即使在这段时间停止一切用户线程,也不会感觉明显卡顿。因此 Serial 垃圾收集器适合客户端使用。

由于 Serial 收集器只使用一条 GC 线程,避免了线程切换的开销,从而简单高效。

ParNew 垃圾收集器(多线程)

ParNew 是 Serial 的多线程版本。由多条 GC 线程并行地进行垃圾清理。但清理过程依然需要 Stop The World。

ParNew 追求“低停顿时间”,与 Serial 唯一区别就是使用了多线程进行垃圾收集,在多 CPU 环境下性能比 Serial 会有一定程度的提升;但线程切换需要额外的开销,因此在单 CPU 环境中表现不如 Serial。

Parallel Scavenge 垃圾收集器(多线程)

Parallel Scavenge 和 ParNew 一样,都是多线程、新生代垃圾收集器。但是两者有巨大的不同点:

  • Parallel Scavenge:追求 CPU 吞吐量,能够在较短时间内完成指定任务,因此适合没有交互的后台计算。

  • ParNew:追求降低用户停顿时间,适合交互式应用。

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

追求高吞吐量,可以通过减少 GC 执行实际工作的时间,然而,仅仅偶尔运行 GC 意味着每当 GC 运行时将有许多工作要做,因为在此期间积累在堆中的对象数量很高。单个 GC 需要花更多的时间来完成,从而导致更高的暂停时间。而考虑到低暂停时间,最好频繁运行 GC 以便更快速完成,反过来又导致吞吐量下降。

  • 通过参数 -XX:GCTimeRadio 设置垃圾回收时间占总 CPU 时间的百分比。

  • 通过参数 -XX:MaxGCPauseMillis 设置垃圾处理过程最久停顿时间。

  • 通过命令 -XX:+UseAdaptiveSizePolicy 开启自适应策略。我们只要设置好堆的大小和 MaxGCPauseMillis 或 GCTimeRadio,收集器会自动调整新生代的大小、Eden 和 Survivor 的比例、对象进入老年代的年龄,以最大程度上接近我们设置的 MaxGCPauseMillis 或 GCTimeRadio。

老年代垃圾收集器

Serial Old 垃圾收集器(单线程)

Serial Old 收集器是 Serial 的老年代版本,都是单线程收集器,只启用一条 GC 线程,都适合客户端应用。它们唯一的区别就是:Serial Old 工作在老年代,使用“标记-整理”算法;Serial 工作在新生代,使用“复制”算法。

Parallel Old 垃圾收集器(多线程)

Parallel Old 收集器是 Parallel Scavenge 的老年代版本,追求 CPU 吞吐量。

CMS 垃圾收集器

CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。

  • 初始标记:Stop The World,仅使用一条初始标记线程对所有与 GC Roots 直接关联的对象进行标记。

  • 并发标记:使用多条标记线程,与用户线程并发执行。此过程进行可达性分析,标记出所有废弃对象。速度很慢。

  • 重新标记:Stop The World,使用多条标记线程并发执行,将刚才并发标记过程中新出现的废弃对象标记出来。

  • 并发清除:只使用一条 GC 线程,与用户线程并发执行,清除刚才标记的对象。这个过程非常耗时。

并发标记与并发清除过程耗时最长,且可以与用户线程一起工作,因此,总体上说,CMS 收集器的内存回收过程是与用户线程一起并发执行的。

​CMS 的缺点:

  • 吞吐量低

  • 无法处理浮动垃圾

  • 使用“标记-清除”算法产生碎片空间,导致频繁 Full GC

对于产生碎片空间的问题,可以通过开启 -XX:+UseCMSCompactAtFullCollection,在每次 Full GC 完成后都会进行一次内存压缩整理,将零散在各处的对象整理到一块。设置参数 -XX:CMSFullGCsBeforeCompaction 告诉 CMS,经过了 N 次 Full GC 之后再进行一次内存整理。

G1 通用垃圾收集器

G1 是一款面向服务端应用的垃圾收集器,它没有新生代和老年代的概念,而是将堆划分为一块块独立的 Region。当要进行垃圾收集时,首先估计每个 Region 中垃圾的数量,每次都从垃圾回收价值最大的 Region 开始回收,因此可以获得最大的回收效率。

从整体上看, G1 是基于“标记-整理”算法实现的收集器,从局部(两个 Region 之间)上看是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。

这里抛个问题 👇

一个对象和它内部所引用的对象可能不在同一个 Region 中,那么当垃圾回收时,是否需要扫描整个堆内存才能完整地进行一次可达性分析?

并不!每个 Region 都有一个 Remembered Set,用于记录本区域中所有对象引用的对象所在的区域,进行可达性分析时,只要在 GC Roots 中再加上 Remembered Set 即可防止对整个堆内存进行遍历。

如果不计算维护 Remembered Set 的操作,G1 收集器的工作过程分为以下几个步骤:

  • 初始标记:Stop The World,仅使用一条初始标记线程对所有与 GC Roots 直接关联的对象进行标记。

  • 并发标记:使用一条标记线程与用户线程并发执行。此过程进行可达性分析,速度很慢。

  • 最终标记:Stop The World,使用多条标记线程并发执行。

  • 筛选回收:回收废弃对象,此时也要 Stop The World,并使用多条筛选回收线程并发执行。

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

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

相关文章

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver解决方案

🌟问题解析 首先,此报错会出现在两种情况,并且有各自的解决方法。 如果在Java程序中报错,那么我们就参考方法1(单Java程序): 如果你是在Tomcat中报错,那么我们可以参考方法2&#…

[附源码]JAVA毕业设计交通事故档案管理系统(系统+LW)

[附源码]JAVA毕业设计交通事故档案管理系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

微信小程序实现微信支付的相关操作设置

本文不涉及相关API的实现,旨在记录实现微信支付需要在微信公众平台和微信支付的商户平台需要进行的操作。 1.首先需要用户申请了微信小程序和入驻微信商户平台 2.获取小程序的appid 设置AppSecre小程序密钥 3.微信支付获取商户号,在认证的时候设置操…

基于JavaSwing的员工工资管理系统

开发环境 eclipsejdk1.8mysql5.7 系统简介 本项目是主要功能有员工信息管理,部门信息管理,员工工资设定,系统设置等,员工不需要登录系统,可以直接查询自己的工资,具体项目操作及项目结构请看演示视频&am…

架构解析:Dubbo3 应用级服务发现如何应对双 11 百万集群实例

继业务全面上云后,今年双 11,阿里微服务技术栈全面迁移到以 Dubbo3 为代表的云上开源标准中间件体系。在业务上,基于 Dubbo3 首次实现了关键业务不停推、不降级的全面用户体验提升,从技术上,大幅提高研发与运维效率的同…

【POJ No. 1019】数字序列 Number Sequence

【POJ No. 1019】数字序列 Number Sequence 北大OJ 题目地址 【题意】 给出单个正整数i ,编写程序以找到位于数字组S 1 , S 2 , …, Sk 序列中第i 位上的数字。每个组Sk 都由一系列正整数组成,范围为1~k ,一个接一个地写入。 序…

Sass扫码点餐源码 单门店多门店餐饮连锁扫码点餐外卖自提系统源码

智慧餐厅扫码点餐小程序系统源码 1. 开发语言:JAVA 2. 数据库:MySQL 3. 原生小程序 4. Sass 模式 5. 带调试视频 本套扫码点餐小程序系统支持多店铺,支持外卖,堂食,扫码点餐、预约桌号、订单语音提醒、会员营销、…

viewport视口的概念

viewport视口的概念 概念详见 MDN,我摘出来对比了下,如下图: 总结: viewport就是当前窗口的可视部分Visual Viewport 视觉视口 就是视口viewport中的可见部分 比如在mobile浏览器中,输入时,弹出的键盘&am…

屏幕开发学习 -- 迪文串口屏

一 前言 最近学习了一款基于图形化开发的屏幕,在摸索一周后,基本熟悉了这款产品的一个开发过程,今天给大家分享一下迪文串口屏和STM32如何建立通讯,有不足之处,还请见谅😁 二 迪文屏介绍 1.选型 我用到的…

Ubuntu 20.04 安装NVIDIA显卡驱动+cuda 11.7+cudnn

Ubuntu 18.04 安装NVIDIA显卡驱动cuda 10.2cudnn本机环境1 相关查询命令一、Ubuntu 18.04 安装NVIDIA显卡驱动1、查看本机显卡能够配置的驱动信息2、安装显卡驱动3、测试nvidia driver是否安装成功二、Ubuntu 20.04 安装cuda 11.71、安装显卡驱动检查2、安装CUDA10.23、配置CUD…

了解世界杯赔率,让您运气更‘好‘(个人分享)

足球世界杯买球赢面计算前言理论基础实际计算用例:代码实现真实数据前言 此文是个人关于世界杯的一些浅显的看法,实际统计结果和计算方法有出入,可能原因:1)数据量不够。2)比赛双方差距够大导致的。但在双…

前端如何实现网页变灰功能?

今天来从前端的角度看看网页置灰是如何实现的,以及相关使用技巧! 实现思路 先来看看一些主流网站是如何实现置灰的: BiliBili:淘宝:京东:掘金:可以看到,这些网站实现置灰的方式都…

计算机网络学习笔记(Ⅰ):计算机网络体系结构

目录 1 概述 1.1 基础概念 1.计算机网络 2.功能 3.组成 4.分类 1.2 标准化工作及相关组织 1.标准化工作 2.相关组织 1.3 性能指标 1.速率 2.带宽 3.吞吐量 4.时延 5.时延带宽积 6.往返时延RTT 7.利用率 2 计算机网络结构 2.1 分层结构 1.分层原则 2.分层结…

专业/户籍不限!腾讯/华为招聘提到的PMP证书!多行业适用

很多有项目管理需求的小伙伴,不知道学PMP到底需要了解些啥,除了考什么,还有就是在报考以及后续续证方面都是需要具体了解清楚的,特别是想要自学PMP的宝子们。这些一定要了解清楚。 这篇直接告诉你PMP的全部相关内容!&…

[附源码]Python计算机毕业设计Django良辰之境影视评鉴系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

Python实战案例,Streamlit+Plotly模块,Python制作销售数据可视化看板,展示分析一步到位

前言 今天给大伙介绍一个用Python制作销售数据大屏的方法。 Let’s start happily 开发工具 Python版本: 3.6.4 相关模块: Streamlit模块 Plotly模块 pandas模块 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可。…

【大数据入门核心技术-Zookeeper】(一)Zookeeper基本原理

目录 一、Zookeeper是用来做什么的 二、Zookeeper的角色 1、Leader 2、Follower 3、Observer 一、Zookeeper是用来做什么的 首先需要了解zookeeper是什么,zookeeper是一个分布式协调服务。所谓分布式协调主要是来解决分布式系统中多个进程之间的同步限制&#…

[附源码]计算机毕业设计JAVA学生档案管理系统论文

[附源码]计算机毕业设计JAVA学生档案管理系统论文 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

[附源码]Python计算机毕业设计SSM酒店停车管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]Python计算机毕业设计Django海滨学院学生大创项目申报与审批系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…