JVM常用垃圾收集器

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.mzph.cn/news/756622.shtml

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

相关文章

计算机二级(Python)真题讲解每日一题:《方菱形》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 请写代码替换横线&#xff0…

SpringCloud入门(1) Eureka Ribbon Nacos

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

PySpark案例实战

一、前言介绍 二、基础准备 # 导包 from pyspark import SparkConf,SparkContext #创建SparkConf类对象 confSparkConf().setMaster("local[*]").setAppName("test_spark_app") #基于SparkXConf类对象创建SparkContext对象 scSparkContext(confconf) #打印…

深入理解栈和队列(一):栈

个人主页:17_Kevin-CSDN博客 专栏:《数据结构》 一、栈的概念 栈(Stack)是一种特殊的线性表,它遵循后进先出(Last-In-First-Out,LIFO)的原则。栈可以被看作是一个只能在一端进行操作…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中,获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库,结合 XPath 解析网页信息,实现对链家网二手房销售数据的爬取,并将数据导出为 Excel 文件的过…

多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测(一)数据集介绍和预处理-CSDN博客 风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

springcloud修炼——Eureka注册中心

如果你要理解这个技术博客博客专栏 请先学习以下基本的知识: 什么是微服务什么是服务拆分什么是springcloud Springcloud为微服务开发提供了一个比较泛用和全面的解决框架,springcloud继承了spring一直以来的风格——不重复造轮子,里面很多的…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接: Attention Is All You Need 参考文章: 【NLP】《Attention Is All You Need》的阅读笔记 一…

WPF按钮相关

跟着官网敲的按钮相关的内容,还涉及了wpf很多其他的知识 1.创建基本按钮 <Grid><StackPanel HorizontalAlignment"Left"><Button>Button1</Button><Button>Button2</Button><Button>Button3</Button></StackPan…

如何在gitee上fork github上面的项目,并保持同步更新

前言 当看到github上面比较好的项目&#xff0c;想用到自己的项目&#xff0c;又不想仓库别人看&#xff0c;同时网络不好&#xff0c;囊中又羞涩的情况下&#xff0c;怎么办&#xff1f; 可以考虑用gitee来同步更新github上面的项目。 一、在gitee创建私有仓库 新建的是选择…

Windows电脑设置自动关机的教程

前言 说来也是搞笑&#xff1a;朋友跟我诉苦说&#xff0c;他有时候下班忘了关闭电脑&#xff0c;结果经常因为电脑不关机导致被领导扣工资。 说到扣工资这个问题&#xff0c;直接仲裁就好啦&#xff01;哈哈哈&#xff0c;突然又是一波泼天的富贵来临&#xff0c;这必须要接住…

计算方法——数据拟合

1、引入&#xff1a;单变量数据拟合 原先的插值要求给出的数据点要在拟合的函数上&#xff0c;但数据拟合&#xff0c;只需整体“近似”&#xff0c;不强求所有的数据点一致 假设给出数据&#xff1a; 那么 偏差 的定义为&#xff1a; 但是偏差“大小”&#xff0c;最好是用绝…

计算机网络:数据交换方式

计算机网络&#xff1a;数据交换方式 电路交换分组交换报文交换传输对比 本博客介绍计算机之间数据交换的三种方式&#xff0c;分别是电路交换、分组交换以及报文交换。 电路交换 我们首先来看电路交换&#xff0c;在电话问世后不久&#xff0c;人们就发现要让所有的电话机都…

c++类和对象(中)类的6个默认成员函数及const成员函数

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;类和对象 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱们之前也是…

【开发环境搭建篇】IDEA安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

C语言——结构体自定义类型

目录 结构体类型 声明结构体 结构体的特殊声明 创建结构体变量和初始化结构体变量 结构体的自引用 结构体内存对齐 对齐规则 内存对齐存在意义 默认对齐数的修改 结构体传参 结构体实现位段 了解位段是什么 位段的内存分配 位段有跨平台的问题及使用注意事项 C语言…

Spark-Scala语言实战(3)

在之前的文章中&#xff0c;我们学习了如何在来如何在IDEA离线和在线安装Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实…

[Halcon学习笔记]标定常用的Halcon标定板规格及说明

1、介绍 大多数标定的要求都是以实心圆或方格来作为标志点&#xff0c;所以一般的标定板为棋盘格或矩阵圆点图&#xff0c;高精度的相机标定过程中&#xff0c;大多是以比较明确的特征点来作为参考&#xff0c;所以通过识别标定板的圆形&#xff0c;拟合出精确的中心位置&…

3.19总结

A计划 题解&#xff1a;这题其实就是一个很简单的三维搜索&#xff0c;有了一个传送门&#xff0c;并且要确定是否传过去的对应位置是墙&#xff0c;防止被装死&#xff0c;同事呢又要在对应的t时间内完成&#xff08;不一定要卡着t时间恰好完成&#xff09; #include<ios…

linux单机部署hadoop

1.下载安装包 https://archive.apache.org/dist/hadoop/common/ 2.上传压缩 3.修改配置文件 1)设置JDK的路径 cd /usr/local/software/hadoop-3.1.3/etc/hadoop vi hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/ 查看…