双非本科准备秋招(10.2)—— JVM3:垃圾收集器

垃圾收集器

分为七种,如下:

从功能的角度分为

1、串行:Serial、Serial Old

2、吞吐量优先:Parallel Scavenge、Parallel Old

3、响应时间优先:CMS

吞吐量优先VS响应时间优先

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

可以写成这个式子:

所以垃圾收集时间越短,吞吐量越大。

Serial

Serial的意思就是串行,在进行垃圾收集时,会Stop the world(咋瓦鲁多!),其实就是暂停其他用户进程。

算法:复制算法。

HotSpot运行在客户端模式下默认的新生代收集器。

ParNew

Serial收集器的多线程并行版本

是Server模式下首选的新生代收集器,因为只有它和Serial能与CMS一起工作。

-XX:ParallelGCThreads 设置GC线程数。

Parallel Scavenge

算法:复制算法。

吞吐量优先的新生代垃圾收集器,有两个控制吞吐量的参数:

控制最大垃圾收集停顿时间:-XX:MaxGCPauseMillis

设置吞吐量大小:XX:GCTimeRatio

与ParNew的最大区别在于,它有一个GC自适应调节策略,会自动调整新生代大小、Eden和Survivor区比例、晋升老年代年龄等参数,来提供最适合的停顿时间或最大吞吐量。

开启开关: XX:+UseAdaptiveSizePolicy

Serial Old

Serial收集器的老年代版本。

算法:标记-整理算法。

供客户端模式下HotSpot虚拟机使用的老年代收集器;当CMS出现Concurrent Mode Failure后会临时启用它

Parallel Old

Parallel Scavenge收集器的老年代版本,并且只能与Parallel Scavenge搭配使用,为Parallel Scavenge而生,从JDK6开始提供。

算法:标记-整理

用于吞吐量大、处理器资源稀缺的情况。

  CMS(Concurrent Mark Sweep)

追求最短停顿时间。

Concurrent并发  Mark标记  sweep清除

CMS工作流程:
  • 初始标记

Stop the world(STW),然后仅仅标记CG Roots能关联的对象,时间最短。

  • 并发标记

进行GC Roots Tracing的过程,不需要STW,与用户进程并发执行,时间最长。

  • 重新标记

修正并发标记期间因用户程序继续运作导致标记变动的对象的标记记录,需要STW。

  • 并发清除

清除死亡的对象,不需要STW,与用户进程并发进行。

问题:

1、吞吐量低:

        因为要与用户进程并发执行,所以垃圾回收需要的执行时间会更长,所以吞吐量低。

2、“浮动垃圾”:

        并发清除的阶段,因为是并发的,用户此时可能还会产生新的垃圾,所以会留出一部分预留内存存放浮动垃圾,如果这块内存不足,会出现Concurrent Mode Failure错误,这时,虚拟机会启用Serial Old替代CMS。

3、标记-清除算法:

        没有整理的过程,会产生很多空间碎片,导致分配大内存时空间不足。

G1(Garbage First)*

2004年论文发布,直到2017年成为JDK9默认垃圾回收器,取代了Parallel Scavenge+Parallel Old组合。

概念

        G1依旧是分代设计,但区别是它不为新生代、老年代分配规定大小区域,而是将堆分成一个个大小固定的区域,称为Region,每个Region都可以是新生代、老年代、Eden、Survivor空间。Region成为了垃圾回收的最小单元,每次回收Region的整数倍。

        同时注重吞吐量(Throughput)和低延迟(low latency),默认暂停目标200ms。

参数

        -XX:+UseG1GC

        -XX:G1HeapRegionSize=size    设置堆内存大小

        -XX:MaxGCPauseMillis=time      暂停目标时间

G1工作流程
  • 初始标记

标记一下GC Roots能直接关联的对象。(需要STW)

  • 并发标记

进行GC Roots Tracing(可达性分析),判断存活对象和可回收对象,然后再处理SATB记录的有引用变动的对象。(不需要STW)

  • 最终标记

短暂停一下,处理并发阶段结束后遗留下来的少量SATB记录(需要STW)

  • 筛选回收

统计各个Region的回收价值和成本并排序,根据用户期望的停顿时间制定回收计划,筛选任意多个Region构成回收集,然后将回收部分的存活对象复制到空Region中,再清理整个旧Region空间。(需要STW)

跨区域引用问题

当对堆进行部分内存区域回收时,会存在跨区域引用问题。可以通过记忆集(Remembered Sets)的方式解决,记忆集列出了从外部指向了本块的所有引用。

每个Rigon都维护自己的记忆集,用来记录别的Region指向自己的指针。

并发标记时收集线程与用户线程互不干扰

1、回收时改变对象引用关系:

        回收时必须保证不能打破原本的对象结构图。G1收集器通过原始快照(SATB)算法实现。

2、回收时创建新对象:

        G1为每个Region设计两个名为TAMS(top at mark start)的指针,把Region中部分空间划分出来用来分配并发回收过程中产生的新对象。

内存分配与回收策略

  1. 通常,对象优先在Eden区分配。若Eden不足:发起一次Minor GC
  2. 大对象直接进入老年代。
  3. 长期存活的对象将会进入老年代,对象头内存储了对象的分代年龄,新生代每经历一次Minor GC就增加一岁,当年龄达到-XX:MaxTenuringThreshold(默认15)时,晋升为老年代。
  4. 并非要求年龄达到-XX:MaxTenuringThreshold才能晋升老年代,如果Survivo空间中相同年龄所有对象大小总和大于Survivor空间的一半,那么年龄大于等于该年龄的对象可以直接进入老年代。
  5. 空间分配担保:如果老年代也放不下怎么办?

每次Minor GC之前检查老年代空间是否能容纳所有新生代对象。

        如果不可以:首先查看虚拟机中 -XX:HandlePromotionFailure参数设置值是否允许担保失败(Handle Promotion Failure).

                如果允许:检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小

                        如果大于:尝试进行一次Minor GC。(有风险)

                        如果小于:进行Full GC。

                如果不允许:进行一次Full GC。

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

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

相关文章

AI-数学-高中-11-指数函数

原作者视频:初等函数】3指数函数(基础)_哔哩哔哩_bilibili 指数函数、幂函数: 注意:分段函数注意看分界点。 注意:复合函数,采用换元法分解为外层和内层2个函数,先计算外层函数t和画…

神经网络建立(结果可变)最小神经元

目录 介绍: 初始化: 建模: 预测: 改变结果: 介绍: 在深度学习中,神经元通常指的是人工神经元(或感知器),它是深度神经网络中的基本单元。深度学习的神经元模拟了生…

如何成为一个更好的沟通者?

新年伊始,我想跟大家分享9条我给自己定下的「沟通准则」。 这9条准则,是我对自己的要求,也是我身体力行践行了许多年的做法。我可能也没能践行得非常完美,但这也是我一直在努力的目标。 如果你希望能够跟别人「好好说话」&#xf…

《SPSS统计学基础与实证研究应用精解》视频讲解:在线分析处理报告

《SPSS统计学基础与实证研究应用精解》5.1 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解5.1节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。本书旨在手把手教会使…

《信息系统项目管理师》备考计划

《信息系统项目管理师》证书价值和作用 信息系统项目管理师证书的价值体现在提升专业知识、助力职业发展、职称评定、技能补贴和人才引进或积分落户等方面。 一方面可以通过系统学习,可以显著提高自己在信息系统项目管理领域的专业水平。方便自己以后向更多的方向…

sqli-labs部署及sqli-labs靶场第一关

部署 一、环境安装 1.下载phpstudy,下载链接:小皮面板(phpstudy) - 让天下没有难配的服务器环境! ,傻瓜式的安装过后打开软件进入如下界面,我们开启nginx和mysql !!!&#xff0…

Java把列表数据导出为PDF文件,同时加上PDF水印

一、实现效果 二、遇到的问题 实现导出PDF主体代码参考:Java纯代码实现导出PDF功能,下图是原作者实现的效果 导出报错Font STSong-Light with UniGB-UCS2-H is not recognized.。参考:itext 生成 PDF(五) 使用外部字体 网上都是说jar包的版本…

C语言循环分支数组练习

目录 一、打印三的倍数 二、从大到小输出 三、三角形判断 四、数9的个数 五、猜数字游戏 六、乘法口诀表 七、求最大值 八、分数求和 九、打印素数 十、打印闰年 十一、最大公约数 十二、打印空心正方形图案 十三、矩阵转置 十四、逆序输出 十五、输入10个整数&…

进程控制(一)进程创建与终止

文章目录 进程创建又识fork函数fork函数返回值写时拷贝fork常规用法fork调用失败的原因 进程终止进程退出的三种场景进程常见退出方法main函数return 0使用exit函数使用_exit函数 异常退出 进程创建 又识fork函数 目前我们知道在Linux下创建进程有两种方式: 命令…

基于springboot网上书城交易平台源码和论文

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括网上书城管理系统的网络应用,在国外网上书城管理系统已经是很普遍的方式,不过国内的书城管理系统可能还处于起步阶段。网上书城管理系统具有网上书城信…

套接字小结

步骤: 1、定义sockaddr_in结构体 并对里面的成员进行初始化 sin_family IPV4还是IPV6 sin_port 端口号 hton: host to net //主机 -> 网络 小端转大端 struct sockaddr_in server_addr , client_addr;//对服务端网络信息结构体进行初始化server_add…

招聘网站简单爬虫_24.1.26

完整程序传送门 24.1.26 前些天接了一个大两届的师兄的小活,做了一下爬boss直聘岗位信息的程序,在这里记录一下 程序框架 定义一个名为paQu的接口函数,用于检查窗口的输入,它接受一个参数self,获取self对象的a属性&am…