双非本科准备秋招(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。

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

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

相关文章

开源软件全景解析:驱动技术创新与行业革新的力量

目录 什么是开源 开源的核心 开源软件的特点 为什么程序员应该拥抱开源 1.学习机会: 2.社区支持: 3.提高职业竞争力: 4.加速开发过程: 5.贡献和回馈: 开源软件的影响力 开源软件多元分析: 开源…

Java实现婚恋交友网站 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新闻管理模块2.4 相亲大会管理模块2.5 留言管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 会员信息表3.2.2 新闻表3.2.3 相亲大会表3.2.4 留言表 四、系统展示五、核心代码5.…

【Java EE初阶十】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap,字面意思:”比较并交换“,且比较交换的是寄存器和内存; 一个 CAS 涉及到以下操作: 下面通过语法来进一步进项说明: 下面有一个内存M,和两个寄存器A,B; CAS(M,A,B)&am…

AQS简介、AQS实现原理、线程夺取锁失败 AQS队列的变化、线程被唤醒时 AQS队列的变化

AQS AQS简介AQS实现原理场景01-线程抢夺锁失败时,AQS队列的变化场景02-线程被唤醒时,AQS队列的变化 AQS简介 AQS(全称AbstractQueuedSynchronizer)即队列同步器。它是构建锁或者其他同步组件的基础框 架(如ReentrantLock、ReentrantReadWriteLock、Sema…

docker核心技术

一. 从系统架构谈起 传统分层架构 vs 微服务 微服务改造 分离微服务的方法建议: 审视并发现可以分离的业务逻辑业务逻辑,在对业务领域不是特别熟悉的时候,按照部门职能进行划分,例如账号、财务等寻找天生隔离的代码模块,可以借助于静态代码分析工具如果可以闭环的解决一…

STM32F4学习

F4系统架构 8个主控总线7个被控总线 主控总线 Cortex-M4内核 I总线Cortex-M4内核 D总线Cortex-M4内核 S总线DMA1存储器总线DMA2存储器总线DMA2外设总线以太网DMA总线USB OTG HS DMA总线 被控总线 内部FLASH ICode总线内部FLASH DCode总线主要内部SRAM1(112KB&a…

二分查找------蓝桥杯

题目描述&#xff1a; 请实现无重复数字的升序数组的二分查找 给定一个元素升序的、无重复数字的整型数组 nums 和一个目标值 target&#xff0c;写一个函数搜索 nums 中的target&#xff0c;如果目标值存在返回下标 (下标从0 开始)&#xff0c;否则返回-1 数据范围: 0 < l…

中继DHCP配置实验

实验大纲 1.构建网络拓扑结构图 2.对路由器进行配置 3.对DHCP服务器进行配置 4.对交换机S1进行配置&#xff08;创建vlan&#xff09; 5.配置路由器&#xff0c;并分配逻辑接口 1.构建网络拓扑结构图 2.对路由器进行配置 Router>en Router#conf t Enter configuratio…

R语言学习case11:ggplot 置信区间(包含多子图)

ggplot Geometric objects How are these two plots similar? 两个图都包含相同的x变量、相同的y变量&#xff0c;并且描述相同的数据。但是这两个图并不相同。每个图使用不同的可视化对象来表示数据。在ggplot2语法中&#xff0c;我们说它们使用不同的geoms。 geom是绘图…

[经验] 月字旁一个卢念什么 #职场发展#媒体#微信

月字旁一个卢念什么 1、月卢念什么 “月卢念什么”是一个广为传颂的故事。传说中&#xff0c;月卢是唐婉的丈夫&#xff0c;也是唐婉的伴读&#xff0c;两人情深意重。有一天&#xff0c;唐婉嫁给了别人&#xff0c;月卢离开了她。从此以后&#xff0c;月卢每晚都背着月亮念唐…

k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(二)

三、简配版集群&#xff0c;适用于demo环境 1.集群架构设计 主机名角色配置(核数&#xff0c;内存&#xff0c;磁盘)MasterRKE,controlplane,etcd,worker,rancher-master2C 8G 40GSlaver1controlplane,worker,rancher-master2C 8G 40GSlaver2controlplane,worker,rancher-mas…

代码随想录算法训练营DAY13 | 栈与队列 (3)

一、LeetCode 239 滑动窗口最大值 题目链接&#xff1a;239.滑动窗口最大值https://leetcode.cn/problems/sliding-window-maximum/ 思路&#xff1a;使用单调队列&#xff0c;只保存窗口中可能存在的最大值&#xff0c;从而降低时间复杂度。 public class MyQueue{Deque<I…

深入剖析 Cortex-M4 微控制器在嵌入式系统中的特性和优势

Cortex-M4 微控制器是 ARM Cortex-M 架构中的一种类型&#xff0c;它具有许多功能和特性&#xff0c;使其在嵌入式系统中具有显著的优势。本文将深入剖析 Cortex-M4 微控制器的特性和优势&#xff0c;并提供示例代码来演示其用法。 ✅作者简介&#xff1a;热爱科研的嵌入式开发…

【LeetCode: 292. Nim 游戏+ 博弈问题】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

LlamaIndex 入门实战

文章目录 LlamaIndex 入门实战1. 基本概念2. 优劣势分析3. 简单代码示例4. Index持久化5. 使用场景6. 总结 LlamaIndex 入门实战 LlamaIndex是一个连接大型语言模型&#xff08;LLMs&#xff09;与外部数据的工具&#xff0c;它通过构建索引和提供查询接口&#xff0c;使得大模…

echarts使用之柱状图(一)

1 基本使用 核心配置主要是xAxis/yAxis/series <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equi…

【VUE】UniAPP之uview组件库,自定义tag封装,支持添加u-icon图标

组件代码 <template><view class"tag" :class"[props.mode, props.shape]"><slot name"left"><!-- icon图标 没有传入图标时不显示 --><u-icon v-if"props.icon ! " :name"props.icon" :color&…

新产品!可视化试卷搭建平台

hi, 大家好, 我是徐小夕. 之前和大家分享了很多可视化低代码和零代码的技术实现和产品设计思路, 也和大家分享了 H5-Dooring 零代码搭建平台的技术实现和未来规划, 今天继续和大家分享一下我们的新产品——橙子试卷. 橙子试卷 是一款可视化试卷/问卷搭建平台, 我们可以通过拖拽…

【算法分析与设计】无重复的最长子串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

qt5入门-状态栏+几种标准对话框

参考&#xff1a; Qt 标准对话框之 QFileDialog_w3cschool https://www.w3cschool.cn/learnroadqt/vsd51j42.html 本地环境&#xff1a; win10专业版&#xff0c;64位 状态栏 QMainWindow类里有一个statusBar()&#xff0c;如果不存在状态栏&#xff0c;这个函数会自动创建一…