JVM专栏-3.垃圾收集器

news/2024/4/26 12:53:40/文章来源:https://blog.csdn.net/Mr_Susy/article/details/130374869

在垃圾收集器的上下文中并发并行的意义

  • 并行(Parallel): 并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态
  • 并发(Concurrent): 并发描述的是垃圾收集器线程和用户线程之间的关系,说明同一时间垃圾收集器线程和用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占用了一部分系统资源,此时应用程序的处理的吞吐量将受到一定的影响

一.新生代收集器

1.Serial收集器

单线程垃圾收集器、最基本、发展最悠久。采用复制算法,它的单线程的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程(Stop The World),直到它收集结束。偶尔用在桌面应用中。

2.ParNew收集器

实质上就是 Serial收集器的多线程并行版本版本,所有的可控参数,收集算法,对象分配规则,回收策略与Serial收集器完全一直

可多线程收集垃圾,收集新生代,使用收集算法

3.Parallel Scavenge收集器

基于标记-复制算法也是能够并行收集的多线程收集器,

特点:

Parallel Scavenge收集器的目标是希望达到一个可控制的吞吐量(Throughput),所谓的吞吐量就是处理器用于运行用户代码的时间与处理器的总消耗时间的比值,多线程收集器,其注重点在于尽可能的缩短垃圾收集时用户线程的停顿时间。
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 运行垃圾收集时间) 吞吐量=运行用户代码时间 / (运行用户代码时间+运行垃圾收集时间) 吞吐量=运行用户代码时间/(运行用户代码时间+运行垃圾收集时间)
Parallel Scavenge 收集器提供了两个参数用于精确控制吞吐量:

- 控制垃圾收集停顿时间(允许的值是一个大于0的毫秒数,收集器将尽力保证内存回收花费的时间不超过用户设定值,但最大停顿时间过短必然会导致新生代的内存大小变小,垃圾回收频率变高,效率可能降低。)
-XX:MaxGCPauseMillis- 设置吞吐量大小(允许的值为一个正整数,表示用户期望虚拟机消耗在Gc上的时间不超过程序运行时间的1/(1+N),默认是99,含义就是收集器的时间消耗不超过总运行时间的1%)
-XX:GCTimeRatio

由于与吞吐量关系密切,Parallel Scavenge也被称为“吞吐量优先收集器”,该收集器还有一个参数为“-XX:+UseAdaptiveSizePolicy”,这是一个开关参数,激活该参数之后,就不需要人工指定新生代的大小等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态的调整这些参数以提供最合适的停顿时间或者最大的吞吐量。这种调节方式称为垃圾收集的自适应调节策略(GC Ergonomics),我们只需要配置内存基本信息(如设置-Xmx设置最大堆,然后使用-XX:MaxGCPauseMillis 参数或者-XX:GCTimeRation参数)具体细节参数的调节工作就由虚拟机完成了。

二.老年代收集器

4.Serial Old收集器

是Serial收集器的老年代版本,也是单线程收集器,采用标记-整理算法。

5.Parallel Old收集器

Parallel Scavenge收集器的老年代版本,也就是我们常常看到的(PS MarkSweep),支持多线程并行收集,基于标记-整理算法。

6.CMS收集器

Concurrent Mark Sweep,采用标记-清除算法,用于老年代,常与ParNew协同工作。
注:并行是指同一时刻同时做多件事情,而并发是指同一时间间隔内做多件事情

工作过程

  • 初始标记(需要STW)
    标记老年代中所有的GC Roots对象和年轻代中活着的对象引用到的老年代的对象,时间短;
  • 并发标记
    从“初始标记”阶段标记的对象开始找出所有存活的对象;
  • 重新标记(需要STW)
    用来处理前一个阶段因为引用关系改变导致没有标记到的存活对象,时间短;
  • 并发清理
    清除那些没有标记的对象并且回收空间。

优点:

并发收集,低停顿

缺点:

占用大量的cpu资源、无法处理浮点垃圾、出现Concurrent Mode Failure、空间碎片。

为什么会出现并发失败(Concurrent Mode Failure)?

因为在垃圾收集期间,用户线程还在持续运行,所以需要预留足够的内存空间给用户线程使用,如果预留的这部分内存无法满足程序分配新对象的需要,就会出现一次并发失败(Concurrent Mode Failure) ,这个是时候虚拟机将不得不开启后备预案,冻结用户线程,临时启用Serial Old 收集器来重新进行老年代的垃圾收集,所以参数-XXCMSInitiatingOccupancyFraction 的设置比例很重要。

7.G1收集器

G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一,早在JDK7就已加入JVM的收集器大家庭中,JDK9中取代Parallel Scavenge 和Parallel Old组合成为默认垃圾收集器。

分代转分区

之前的垃圾收集器,进行收集的范围要么是整个新生代(Minor GC),要么就是整个老年代(Major GC) ,要么就是整个堆(Full GC),G1面向内存的任何部分组成回收集(Collection Set,一般称为CSet),进行回收,回收标准不再是判断属于那个分代,而是那块内存中存放的垃圾数量最多,回收的利益最大。

G1虽然也是遵循分代收集理论,但是不再以固定的大小和固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个region根据需要扮演新生代的Eden区,Survivor空间,或者老年代。

Humongous区

专门用来存储大对象,G1认为只要大小超过一个Region容量一半的对象即可判定为大对象。

工作过程

  • 初始标记(需要STW):

标记GC Root能够直接关联到的对象,该阶段需要短暂停顿,但是耗时很短

  • 并发标记

从GC Root开始对堆中的对象进行可达性分析,递归扫描整个堆里的对象图,找到要回收的对象,该阶段耗时比较长,可以与用户程序并发执行

  • 最终标记(需要STW)

对用户线程做一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录

  • 筛选回收(需要STW)

负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划。然后把决定回收的那一部分的Region的存活对象复制到空的Region中,再清理掉整个旧的Region的全部空间。这里的操作涉及到存活对象的移动,是必须暂停用户线程的,由多条收集器线程并行完成的

优势:

  • 并行(多核CPU)与并发;
  • 分代收集(新生代和老年代区分不明显);
  • 空间整合,G1从整体上来看是基于“标记-整理”算法实现的,从局部两个region之间又是基于”标记-复制“算法实现。这两种算法都意味着G1运作期间不会产生内存碎片;
  • 限制收集范围,可预测的停顿。

缺点:

需要额外占用百分之十到百分之二十内存

搭配组合:

默认垃圾回收方式 代表垃圾回收器

默认垃圾回收方式代表垃圾回收器
UseSerialGC“Serial” + “Serial Old”
UseParNewGC“ParNew” + “Serial Old”
UseConcMarkSweepGC“ParNew” + “CMS”
UseParallelGC“Parallel Scavenge” + “Parallel Old”
UseParallelOldGC“Parallel Scavenge” + “Parallel Old”

JVM日志打印详情

# 必备
-XX:+PrintGCDetails 
# 打印对象分布情况
-XX:+PrintGCDateStamps 
-XX:+PrintTenuringDistribution 
# 每次发生GC后查看下堆前后的内存情况
-XX:+PrintHeapAtGC 
# 打印引用信息
-XX:+PrintReferenceGC 
# STW时间
-XX:+PrintGCApplicationStoppedTime# 可选
-XX:+PrintSafepointStatistics 
-XX:PrintSafepointStatisticsCount=1# GC日志输出的文件路径
-Xloggc:/path/to/gc-%t.log
# 开启日志文件分割
-XX:+UseGCLogFileRotation 
# 最多分割几个文件,超过之后从头文件开始写
-XX:NumberOfGCLogFiles=14
# 每个文件上限大小,超过就触发分割
-XX:GCLogFileSize=100M

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

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

相关文章

Codeforces Round 861 (Div. 2)(A~D)

A. Lucky Numbers 给出边界l和r,在区间[l, r]之间找到幸运值最大的数字。一个数字的幸运值被定义为数位差的最大值,即数字中最大的数位和最小的数位的差。 思路:因为涉及到至少两位,即个位和十位变化最快,最容易得到相…

07 - 进程创建大盘点

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录 1. 进程创建回顾2. 再论进程创建2.1 思考2.2 vfork()深度分析2.3 vfork()要点分析2.4 fork()的现代优化2.5 编程实验:fork() &…

被遗忘的Java关键字:transient

前言 今天在看项目代码时候,看到了下面这样一行代码,用transient修饰了一个变量,主要作用是做一个全局开关。说实话我是第一次看到这个关键字。激发了我的好奇心,所以就了解一下这是何方神圣。 /*** 全局开关*/public static tran…

最新研究:可审计的具有拜占庭鲁棒的联邦学习方案

本人新论文,可免费下载:https://download.csdn.net/download/liangyihuai/87727720 Y. Liang, Y. Li and B. -S. Shin, “Auditable Federated Learning With Byzantine Robustness,” in IEEE Transactions on Computational Social Systems, doi: 10.…

浅谈拉格朗日插值法

浅谈拉格朗日插值法 好像FFT要用到,所以就学习一手 文章目录 浅谈拉格朗日插值法什么是插值拉格朗日插值法 什么是插值 在离散数据的基础上补插连续的函数,使得这条连续函数经过所有离散数据点,这个过程就叫插值。其意义在于: …

论文阅读:DLME = Deep Local-flatness Manifold Embedding

Author: Zelin Zang, Siyuan Li, Di Wu and Stan Z Li. 1-4: Westlake University 摘要 流形学习(ML, Manifold learning)旨在从高维数据中识别低维结构和嵌入,然而我们发现现有工作在采样不足的现实数据集上效果不佳。一般的ML方法对数据结…

LNMP网站框架搭建

1. Nginx的工作原理 php-fpm.conf 是控制php-fpm守护进程的 php.ini是php解析器 工作进程: 1.客户端通过域名进行请求访问时,会找Nginx对应的虚拟主机 2. Nginx对该请求进行判断,如果是静态请求,Nginx会自行处理,并将处理结果返…

【C++】了解设计模式、 stackqueue的使用与模拟实现

文章目录 1.设计模式2.stack1.stack的使用1.stack的结构2.stack的接口 2.stack的模拟实现1.stack的结构2.接口实现 3.queue1.queue的使用1.queue的结构3.queue的接口 2.queue的模拟实现1.queue的结构2.接口实现 4.了解deque1.deque的原理介绍2.deque的底层结构3.deque的迭代器设…

【Android入门到项目实战-- 7.1】—— 如何使用通知?

目录 一、创建通知的步骤 1、创建一个NotificationManager实例 2、使用一个Builder构造器来创建Notification对象 3、设置标题、文字、时间和图标等信息 4、显示通知 二、通知实例演示 三、实现通知的点击效果 1、PendingIntent 什么是PendingIntent? 如何使…

Linux下实现C语言程序

一.情况说明 写这篇博客的情况比较复杂,首先我本来是参加新星计划按照规划现在去学习shell脚本语言的,但是博主现在由于其他原因需要了解makefile,makefile是Linux系统下的一种工具,makefile的一些背景要涉及链接库的知识&#xf…

HTB-DevOops

HTB-DevOops 信息收集5000端口 立足python反序列化攻击XEE读取SSH root 信息收集 5000端口 根据文字所述,下面的图片是feed.py。 目录扫描 /upload如下: 上传测试xml文件。 得到反馈 怀疑是标签不匹配,尝试寻找匹配的标签。前面首页有提…

【算法】【算法杂谈】判断点是否在三角形内部(面积法和向量法)

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介…

Java企业电子招标采购系统源码Spring Boot + Mybatis + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

HTB靶机-Lame-WP

Lame 简介: Lame is a beginner level machine, requiring only one exploit to obtain root access. It was the first machine published on Hack The Box and was often the first machine for new users prior to its retirement Tags: Injection, C…

OSCP-XPosedAPI(本地文件包含、查看源码、os.system、命令盲注)

目录 扫描 Web API枚举 命令盲注 提权 扫描 发现了两个开放的端口:端口22上的SSH和端口13337上的未知服务。 用netcat手动探测端口13337,但是运行几个常见的TCP/UDP服务初始化命令没有输出。 尝试了一个完整的脚本和版本nmap扫描的开放端口࿰

Vue+Echarts 项目演练(下)收尾工作图表绘制

设置销售总量图表 中心容器地图设置 产品库存统计图 产品类别图表 项目可视化完结-整体展示 设置销售总量图表 在第一个容器中进行图表设置 <template><div><h2>A</h2><div class"chart" id"oneChart">容纳后期的图表…

ChatGPT进化的过程简介

Chat GPT可以做什么&#xff1f; 分点列条的回答问题 写代码或SQL 翻译 语法检查 ChatGPT官方还未公开论文&#xff0c;ChatGPT有一个“孪生兄弟”InstructGPT&#xff0c;InstructGPT有论文&#xff0c;可以根据InstructGPT论文推导ChatGPT的训练过程&#xff1a; ChatGPT的…

MySQ基础知识整合

目录 模糊查询 排序 单行函数 多行函数 分组函数 having 单表查询执行顺序总结 distinct 连接查询 子查询 union limit DQL语句执行顺序 DDL语句 日期化 date和date_format区别 update table 的快速创建以及删除&#xff08;及回滚&#xff09; 约束 事务 …

Vector-常用CAN工具 - 入门到精通 - 专栏链接

一、CANoe篇 1、CANoe入门到精通_软件安装 2、CANoe入门到精通_硬件及环境搭建 3、CANoe入门到精通_软件环境配置 4、CANoe入门到精通_Network Node CAPL开发 5、CANoe入门到精通_Node节点开发基本数据类型 6、CANoe入门到精通_Test Node节点开发设置 7、CANoe入门到精通…

缩小数据文件

今天又出现12.2c 环境的问题&#xff0c;1T的数据空间还剩下2G&#xff0c;吓了一身冷汗&#xff0c;赶紧查看原因&#xff0c;不知道哪路业务大神作妖了。 发现sysaux和system增加N多数据文件&#xff0c;而且目前使用不多&#xff0c; 缩小表空间的数据文件 可以使用下面的语…