JVM常用垃圾收集器

news2024/11/28 16:45:02

JVM

image.png

4.1 哪些对象可以作为GC ROOT?

  • 虚拟机栈(栈帧中的局部变量表)中引用的对象
  • 本地方法栈中引用的对象
  • 方法区静态变量引用的对象
  • 方法区常量引用的对象
  • 被同步锁持有的对象
  • JNI(Java Native Interface)引用的对象

4.2 常用垃圾收集器

1、Serial 收集器

  • 单线程收集器

  • 收集时暂停用户线程(Stop the World)

  • 简单高效(与其他收集器的单线程相比)

新生代老年代
标记-复制标记-整理

img

2、ParNew收集器

  • Serial多线程版本

  • 收集时暂停用户线程(Stop the World)

  • 除了 Serial 收集器外,只有它能与 CMS 收集器(真正意义上的并发收集器,后面会介绍到)配合工作

新生代老年代
标记-复制标记-整理

img

3、Parallel Scavenge收集器

  • 类似ParNew,不过可以指定老年代使用串行还是并行收集
-XX:+UseParallelGC
    使用 Parallel 收集器+ 老年代串行
    
-XX:+UseParallelOldGC
    使用 Parallel 收集器+ 老年代并行
  • 关注吞吐量(CMS关注用户体验)

  • 收集时暂停用户线程(Stop the World)

  • JDK8默认收集器( JDK1.8 默认使用的是 Parallel Scavenge + Parallel Old,如果指定了-XX:+UseParallelGC 参数,则默认指定了-XX:+UseParallelOldGC,可以使用-XX:-UseParallelOldGC 来禁用该功能)

新生代老年代
标记-复制标记-整理

img

4、Serial Old收集器

  • Serial 老年代版本,单线程。
  • 收集时暂停用户线程(Stop the World)
  • 用于在Jdk1.5以上和Paraller Old搭配使用;或者作为CMS收集器的备选方案
新生代老年代
标记-复制标记-整理

img

5、Paraller Old收集器

  • Parallel Scavenge老年代版本
  • 注重吞吐量
  • 收集时暂停用户线程(Stop the World)
    img

6、CMS(Concurrent Mark Sweep)收集器

  • 是一种以获取最短回收停顿时间为目标的收集器,注重用户体验
  • HotSpot第一款真正意义上的并发收集器,第一次实现让垃圾线程和用户线程同时工作 收集方式 标记-清除
收集流程:
  • 初始标记:暂停所有其他线程,记录直接与root连接的对象,速度很快
  • 并发标记:同时开启GC和用户线程,使用一个闭包结构去记录可达对象。但是在这个阶段结束后,这个闭包结构并不能保证当前所有对象可达,因为用户线程会不断的更新引用域,所以GC线程无法保证可达性分析的实时性。这个算法作用就是跟踪记录这些发生引用更新的地方。
  • 重新标记:作用是修正并发标记时因为用户程序而导致标记变更的那一部分对象的标记记录,这个阶段的停顿时间比初始标记时间长,但是远远比并发标记时间短。
  • 并发清除:开启用户线程后,同时GC线程开始对未标记的区域做清扫。

在这里插入图片描述

优点:
  • 并发收集
  • 停顿低,用户线程友好
缺点:
  • 对CPU资源敏感
  • 无法处理浮动垃圾
  • 使用的标记-清除算法会导致收集结束时有大量空间碎片
    JDK9开始,CMS已被弃用

7、G1收集器

  • 面向服务器的垃圾收集器,极高概率满足GC停顿时间和吞吐量有要求
  • 并行与并发:可以充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者核心)来缩短stop-the-world停顿时间。部分其他收集器原本需要停顿Java线程执行GC,但是G1仍然可以通过并发的方式让Java程序继续执行
  • 分代收集:不需要和其他收集器配合,自己使用分代收集
  • 空间整合:整体可以看做是基于“标记-整理”算法实现的收集器;从局部看是基于“标记-复制”算法实现的。
  • 可预测的停顿:G1的一个大优势,G1除了追求低停顿外,还能建立可预测的时间模型,能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间不得超过 N 毫秒。
收集流程
  • 初始标记
  • 并发标记
  • 最终标记
  • 筛选回收

img

G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region(这也就是它的名字 Garbage-First 的由来) 。这种使用 Region 划分内存空间以及有优先级的区域回收方式,保证了 G1 收集器在有限时间内可以尽可能高的收集效率(把内存化整为零)。

从 JDK9 开始,G1 垃圾收集器成为了默认的垃圾收集器。

8、ZGC 收集器

与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。

ZGC 可以将暂停时间控制在几毫秒以内,且暂停时间不受堆内存大小的影响,出现 Stop The World 的情况会更少,但代价是牺牲了一些吞吐量。ZGC 最大支持 16TB 的堆内存。

ZGC 在 Java11 中引入,处于试验阶段。经过多个版本的迭代,不断的完善和修复问题,ZGC 在 Java15 已经可以正式使用了。
不过,默认的垃圾回收器依然是 G1。你可以通过下面的参数启用 ZGC:

java -XX:+UseZGC className

在 Java21 中,引入了分代 ZGC,暂停时间可以缩短到1毫秒以内。

你可以通过下面的参数启用分代 ZGC:

java -XX:+UseZGC -XX:+ZGenerational className

4.3各个收集器之间的关系

image.png

各个垃圾收集器可以配合使用

文章参考地址

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

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

相关文章

2.28CACHE,虚拟存储器

主存储器,简称主存。CPU可以直接随机地对其进行访问,也可以和高速缓存器及辅助存储器交换数据。 2> 辅助存储器,简称辅存,不能与CPU直接相连,用来存放当前暂时不用的程序和数据 3> 高速缓冲存储器,位于主存和CPU之间,用来…

Cesium:按行列绘制3DTiles的等分线

作者:CSDN @ _乐多_ 本文将介绍如何使用 Cesium 引擎根据模型的中心坐标,半轴信息,绘制 3DTiles 对象的外包盒等分线。 外包盒是一个定向包围盒(Oriented Bounding Box),它由一个中心点(center)和一个包含半轴(halfAxes)组成。半轴由一个3x3的矩阵表示,这个矩阵是…

基于Spring boot食品安全信息管理系统

摘 要 食品安全信息管理系统设计的目的是为用户提供食品信息、科普专栏、食品检测、检测结果、交流论坛等方面的平台。 与PC端应用程序相比,食品安全信息管理系统的设计主要面向于用户,旨在为管理员和用户提供一个食品安全信息管理系统。用户可以通过AP…

openEuler 22.03(华为欧拉)一键安装 Oracle 19C(19.22) 数据库

前言 Oracle 一键安装脚本,演示 openEuler 22.03 一键安装 Oracle 19C 单机版过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载地址:Shell脚本安装Oracle数据…

echarts多个折线图共用一个x轴和tooltip组件

实现效果 根据接口传来的数据&#xff0c;使用echarts绘制出&#xff0c;共用一个x轴的图表 功能&#xff1a;后端将所有数据传送过来&#xff0c;前端通过监听选中值来展示对应的图表数据 数据格式&#xff1a; 代码&#xff1a; <template><div><div clas…

基于SpringCloud的菜谱美食交流系统Eureka

本技术是java平台的开源应用框架&#xff0c;其目的是简化Sping的初始搭建和开发过程。默认配置了很多框架的使用方式&#xff0c;自动加载Jar包&#xff0c;为了让用户尽可能快的跑起来spring应用程序。 本选题致力于开发一个菜谱交流系统&#xff0c;旨在帮助越来越多的人可以…

【计算机视觉】Gaussian Splatting源码解读补充

本文旨在补充gwpscut创作的博文学习笔记之——3D Gaussian Splatting源码解读。 Gaussian Splatting Github地址&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting 论文地址&#xff1a;https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gauss…

第六篇:视频广告格式上传指南(上) - IAB视频广告标准《数字视频和有线电视广告格式指南》

第六篇&#xff1a; 视频广告格式和上传指南&#xff08;上&#xff09; --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准&#xff08;2&#xff09; 流媒体数字视频的广告格式分为线性和非线性两大类。任何一个广告都可以与显示在视频播放器外部的伴随横幅一起提…

电脑数据安全新利器:自动备份文件的重要性与实用方案

一、数据安全的守护神&#xff1a;自动备份文件的重要性 在数字化时代&#xff0c;电脑中的文件承载着我们的工作成果、个人回忆以及众多重要信息。然而&#xff0c;数据丢失的风险无处不在&#xff0c;无论是硬件故障、软件崩溃&#xff0c;还是恶意软件的攻击&#xff0c;都…

nodejs基于vue班级管理系统的设计与实现-flask-django-python-php

根据现实需要&#xff0c;此系统我们设计出一下功能&#xff0c;主要有以下功能模板。 1.学生功能&#xff1a;首页、个人中心、课程信息管理、学生成绩管理、班级事件管理、班费支出管理、班级相册管理、班级音乐角管理。 2.管理员功能&#xff1a;首页、个人中心、班级管理、…

Qt5.9.6+VS2015 部署PCL1.8.1

本文系转载&#xff0c;如侵权请告知删除。原博文链接&#xff1a;https://blog.csdn.net/jepco1/article/details/80752954 0 编译环境 所需软件包及其版本 Qt5.9.6 msvc2015_64 VS2015 VTK 8.0.0 https://gitlab.kitware.com/vtk/vtk/tree/v8.0.0 PCL1.8.1 https://github.c…

[PwnThyBytes 2019]Baby_SQL

[PwnThyBytes 2019]Baby_SQL 查看源码发现 下载源码&#xff0c;首先观察index.php 首先进入index.php&#xff0c;会执行session_start();启动session这里通过foreach将所有的环境变量的值都遍历了一遍&#xff0c;并且都使用了addslashes()进行转义&#xff0c;然后就定义了…

SpringCloud入门(1) Eureka Ribbon Nacos

这里写目录标题 认识微服务SpringCloud 服务拆分和远程调用服务拆分案例实现远程调用 RestTemplate Eureka注册中心Eureka的结构和作用搭建eureka-server服务注册服务发现 Ribbon负载均衡 LoadBalancedLoadBalancerIntercepor源码解析负载均衡策略饥饿加载 Nacos注册中心安装与…

【Node.js从基础到高级运用】十五、单元测试与集成测试

引言 在Node.js开发过程中&#xff0c;测试是确保代码质量和功能正确性的关键步骤。单元测试和集成测试是最常见的测试类型。下面我们将使用Jest框架来进行测试。 单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证。在Node.js中&#xff0c;这通常指的是函数或者…

将html网页展示的图表,下载到PPT文档内,以图片的形式展示在PPT内

使用到的工具有&#xff1a; 开发工具&#xff1a;IDEA 报表开发工具&#xff1a;帆软10.0.19 1、针对帆软报表[普通报表]的设置 1.1首先选中在帆软里制作好的报表&#xff0c;选择模板web属性 1.2.选择数据分析模式&#xff0c;添加一个事件设置&#xff0c;该事件应该设置“…

抖音视频爬虫工具安装|视频无水印批量下载软件

抖音视频批量下载工具安装教程 想要快速、便捷地批量下载抖音视频吗&#xff1f;不用担心&#xff0c;我们为您提供了简单易行的安装教程&#xff0c;让您轻松体验抖音视频的下载乐趣。q1977470120跟随以下步骤&#xff0c;一起来安装抖音视频批量提取工具吧&#xff01; 步骤…

Android 系统源码中添加可执行程序

Android 系统源码中添加可执行程序 本文基本Android 10的源码环境 android 添加的可执行程序&#xff0c;可以分为两类&#xff1a; * C/C 可执行程序 * Java 可执行程序 &#xff08;jar&#xff09;在了解如何给 android 添加可执行程序前&#xff0c;我们需要了解一下ARM…

云原生相关知识

一、kubernetes 1 概述 Kubernetes&#xff08;也称 k8s 或 “kube”&#xff09;是一 个​​开源​​的容器编排平台&#xff0c;可以自动完成在部署、管理和扩展容器化应用过程中涉及的许多手动操作。 我们常说的编排的英文单词为 “Orchestration”&#xff0c;它常被解释…

Linux中,黑窗口使用vi编辑文件

linux用的比较少&#xff0c;一般我只用来部署项目的时候安装环境和传文件&#xff0c;好多乱七八糟的命令&#xff0c;好多东西&#xff0c;不会啊啊啊啊啊啊啊。 这个改文件几百年才用一次,我只想编辑一下文件&#xff0c;百度搜出来一大堆命令&#xff0c;各种模式什么的&am…

【JVM】如何判断堆上的对象没有被引用?

如何判断堆上的对象没有被引用&#xff1f; 常见的有两种判断方法&#xff1a;引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&#xff0c;取消引用时减1。 引用计数法的缺点-循环引用 引用计数法的优点是实现简单&…