双非本科准备秋招(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.mzph.cn/news/668941.shtml

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

相关文章

如何通过ETL实现快速同步美团订单信息

一、美团外卖现状 美团作为中国领先的生活服务电子商务平台,其旗下的美团外卖每天承载着大量的订单信息。这些订单信息需要及时入库、清洗和同步,但由于数据量庞大且来源多样化,传统的手动处理方式效率低下,容易出错。比如&#…

ANTLR4规则解析生成器(一):入门

文章目录 1 什么是ANTLR42 为什么需要ANTLR43 环境搭建4 官方示例4.1 编写语法规则文件4.2 生成语法解析器4.3 基于SDK实现逻辑 5 总结 1 什么是ANTLR4 ANTLR是ANother Tool for Language Recognition的缩写,它是一个强大的用于读取、处理、执行和翻译结构化文本或…

数据库性能监控 ,数据库可用性监控 #mysql##oracle##SQLserver#_

当谈到监控数据库的性能和可用性时,涉及的方面多种多样。数据库是许多组织业务中的关键组成部分,因此确保其高性能和不间断可用性对于业务的成功至关重要。因此建立一个全面的监控系统至关重要。让我们深入探讨数据库性能和可用性监控的各个方面。 数据…

深刻理解树状数组--树状数组构造定义与动态维护区间和的合理性证明

文章目录 一.树状数组概览二.树状数组构造定义lowbit运算树状数组的结点值的定义树状数组结点层次的定义树状数组父子结点关系定义 三.关于树状数组结构的重要证明引理1引理2树状数组模板题 一.树状数组概览 树状数组的下标从1开始标识,其物理结构是线性表,逻辑结构是一颗多叉…

C语言——O/动态内存管理

目录 一、为什么要有动态内存分配 二、malloc 和 free 1、malloc 2、free 三、calloc和realloc 1、calloc 2、realloc 四、常见的动态内存的错误 1、对NULL指针的解引用操作 2、对动态开辟空间的越界访问 3、对非动态开辟内存使用 free 释放 4、使用free释放一块动…

详细关于如何解决mfc140.dll丢失的步骤,有效修复mfc140.dll文件丢失的问题。

mfc140.dll文件是Microsoft Visual Studio 2015程序集之一,它包含用于支持多种功能的代码和库。当这个mfc140.dll文件丢失时,可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到mfc140.dll丢失的问题,但是这并不是不可解决的困难。…

Linux中判断文件系统的方法

文章目录 Linux中判断文件系统的方法1.使用mount命令2.使用blkid命令3.使用file命令4.使用fstab文件5.使用df命令(这个用的比较多)6.使用fsck命令7.使用lsblk命令(推荐-简单好用) Linux中判断文件系统的方法 1.使用mount命令 # 这样查看的只有已经挂载…

浅谈连续逆F类的基础理论-波形、最佳阻抗、输出功率

浅谈连续逆F类的基础理论 各种逆类型的功放好像都少引人关注,因为很多人学完正的连续B/J类和连续F类,想当然的类推到了连续逆F类上面去。貌似连续逆F类就是连续F类的电压电流交换一下而已,无需额外的注意,实际并非那么简单的。 浅…

2024年全球手机市场复苏 传音打响出海品牌进阶之战

2024年智能手机将迎来新一轮“增长季”。根据市场研究机构TechInsights的最新预测,2024年全球智能手机市场将恢复低个位数的增长。对广大手机厂商来说,这无疑是个好消息,但如何在逐渐回暖却竞争激烈的市场中站稳脚跟就需要他们“各显神通”了…

邮件群发软件有效果吗?邮箱如何群发邮件?

邮件群发软件如何选择比较好?推荐的EDM邮件批发系统? 许多人开始寻找提高工作效率和推广业务的方法。其中,一种备受关注的工具是邮件群发软件。那么,究竟邮件群发软件是否有效呢?蜂邮EDM将深入探讨这个问题&#xff0…

如何在Vue应用程序中使用Vue-Router来实现路由嵌套动画效果

Vue-Router是Vue.js官方的路由管理插件,可以帮助我们轻松管理应用程序的路由。除了基本的路由功能外,Vue-Router还允许我们在切换路由时添加动画效果,提升用户体验。本文将介绍如何使用Vue-Router来实现路由嵌套动画效果,并提供具…

nginx初学者指南

一、启动、停止和重新加载配置 前提:先要启动nginx 在Windows上启动nginx的步骤如下: 1. 下载并安装nginx。可以从nginx官网下载适合自己操作系统的版本,一般是zip压缩包,解压到指定目录中。 2. 进入nginx的安装目录&#xff…

基于Java (spring-boot)的实验室管理系统

一、项目介绍 基于Java (spring-boot)的交通管理系统功能:注册登录、个人信息管理、驾驶证业务类型管理、机动车业务类型管理、新闻类型管理、违法处理业务类型管理、驾驶证业务管理、机动车业务管理、新闻管理、违法处理业务管理、用户管理。 二、作品包含 ​ 三、…

(源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模

本篇文章是: 2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模的源码版本,包含具体建模代码到生成模型步骤。那么废话不多说直接开始展示建模过程建模: 数据预处理 之前我给大家提供的一年的风暴数据是远远不够的,要做时…

Redis核心技术与实战【学习笔记】 - 14.Redis 旁路缓存的工作原理及如何选择应用系统的缓存类型

概述 我们知道,Redis 提供了高性能的数据存取功能,广泛应用在缓存场景中,既可以提升业务的响应速度,又可以避免把高并发的请求发送到数据库。 如果 Redis 做缓存时出现了问题,比如说缓存失效,那么&#x…

C++进阶--搜索二叉树

概念 搜索二叉树是一种特殊的二叉树,其具有以下特点: 1.对于每个结点,它的左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。 2.左子树和右子树都是搜索二叉树。 这个 特性使得搜索二叉树可…

2024初始Spring(并使用idea创建springweb项目)

前言 spring呢,以前一直是简单的了解,并没有利用空闲时间去进行对应的深入的学习,今天呢原本是打算好好学的,然后后来呢感觉还是太早了接触,打算把前面知识在过一编之后再开始 Spring介绍 Spring | Home 大家想要访…

SQL必知必会笔记(13~16章)

第十三章 创建高级联结 1、别名:缩短SQL语句,允许在一条Select语句中多次使用相同的表 SELECT A.Name, A.Maths, A.English FROM transcript AS A INNER JOIN student_id As B ON A.Name B.Name; 2、Oracle数据库中没有AS关键字,直接在表名或…

英码科技携手昇腾共建算力底座:推出EA500I超强AI处理能力边缘计算盒子!

在数字经济浪潮中,算力已成为不可或缺的驱动力,为各行各业的数字化转型提供了强大的推动力。面对多元化和供需不平衡的挑战,需要实现从理论架构到软硬件实现的质的飞跃,以满足持续增长的算力需求,华为昇腾在这一方面展…

VS Code+Live Server插件开发游戏并结合内网穿透分享好友异地访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程,我们将通过VS Code实现远程开发MENJA小游戏,并通过cpolar内网穿透发布到公网,分…