当前位置: 首页 > news >正文

经典垃圾回收器

1.各垃圾回收器之间的配合使用关系

 2.垃圾回收器的种类

2.1 Serial收集器(默认新生代收集器)

       Serial收集器是历史最悠久的收集器,曾经是新生代收集器的唯一选择,它是一个单线程工作的收集器,其“单线程”的意义不仅仅是说明它只会使用一个处理器或者一条收集线程去完成垃圾收集工作,更重要的是强调它在进行垃圾回收的时候,必须暂停其他所有工作线程,直到它收集结束

 优点:

  • 简单而且高效
  • 对于内存资源受限的环境,它是所有收集器中额外内存消耗最小的
  • 对于单核处理器或者处理器核心较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率

2.2 ParNew收集器

ParNew收集器手机上是Serial收集器的多线程并行版本

 注意:除了Serial收集器之外,目前只有它才可以和CMS进行配合工作

       但是随着垃圾回收器的不断改进,更先进的G1收集器带着CMS的继承者和替代者出现了,G1是一个面向全堆的收集器,不需要其他收集器进行配合工作,从这(JDK9)之后,取消了ParNew+SerialOld 以及Serial+CMS的收集器组合,变相的将ParNew合并到了CMS中,称为它专门处理新生代的组成部分,ParNew可以说是第一个退出历史舞台的垃圾收集器

2.3 Parallel Scavenge收集器

       Parallel Scavenge收集器(吞吐量优先收集器)也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器,其收集器的特点是它的关注点与其他收集器不同,CMS等收集器关注的是尽可能的缩短垃圾收集时用户的停顿时间,而Parallel Scavenge收集器关注的是达到一个可控制的吞吐量(处理器用于运行用户代码的时间与处理器总消耗时间的比值)

注意:

  • 停顿时间越短就越适合需要与用户交互或者需要保证服务响应质量的程序、良好的响应速度能提升用户体验
  • 高吞吐量则可以最高效率的利用处理器资源,尽快的完成程序的运算任务,主要适合在后台运算而不需要太多交互的分析任务

2.4 Serial Old收集器

Serial Ol是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法

 2.5 Parallel Old收集器

       Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现,它的出现,“吞吐量优先”收集器终于有了比较名副其实的搭配组合,在注重吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge + Parallel Old收集器这个组合

2.6 CMS收集器

       CMS收集器是一种以获得最短回收停顿时间为目标的收集器,其基于标记-清除的算法实现,分为4个步骤:

  • 初始标记:初始标记的仅仅只是标记一下GC Roots能够直接关联到的对象,速度非常快
  • 并发标记:从GC Roots的直接关联对象开始遍历整个对象的过程(并发
  • 重新标记:修改并发标记期间,因为用户程序继续运作而导致标记产生变动的那一小部分对象的标记记录(增量更新)
  • 并发清除:清理删除掉标记阶段判断的已经死亡的对象(并发
2.6.1 CMS的缺点
  • CMS收集器对处理器资源非常敏感
  • CMS无法处理“浮动垃圾”
  • 收集结束后会产生大量的空间碎片

2.7 Garbage First收集器

       Garbage First(G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式

2.7.1 G1的细节问题的解决方法
  • 将Java堆分成多个独立Region后,Region里面存在的跨Region引用对象如何解决?

       使用记忆集避免全堆作为GC Roots的扫描对象,其每个Region都维护有自己的记忆集,这些记忆集会记录下别的Region指向自己的指针,并标记这些指针分别在哪些卡页的范围内,G1的记忆集更像一个哈希表,key值是Region的起始位置,value是集合(卡表的索引),但是由于Region的数量比较多,所以G1收集器要比其他的收集器有着更高的内存占用负担(耗费相当于Java堆的10%~20%的额外内存)

  • 在并发标记阶段如何保证收集线程与用户线程互不干扰的运行?

       G1收集器时采用原始快照算法实现,垃圾收集的过程中肯定会有新的对象被创建,G1为每一个Region设计了两个名为TAMS的指针,把Region中的一部分空间划分出来用于并发回收过程中的对象内存分配,并发回收时新分配的对象地址都必须要在这两个指针位置上,G1收集器默认在这个地址以上的对象是被隐式标记过的(默认是存活的),不纳入回收范围之内,但是如果内存回收的速度赶不上创建对象分配内存的速度,会冻结用户线程,而导致长时间的“Stop the world”

  • 怎么样建立起可靠的停顿预测模型?

       G1收集器的停顿预测模型是以衰减均值为理论基础实现的,在垃圾收集的过程中,G1收集器会记录每个Region的回收耗时以及记忆集里的脏卡数量等各个可测量的步骤花费的成本,并分析得出平均值、标准偏差、置信度等统计信息,Region的统计状态越新越能决定其回收的价值,然后通过这些信息预测回收哪些Region才可以在不超过期望停顿时间的约束下获得最高的利益

2.7.2 G1的运行步骤
  • 初始标记:只标记一下GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行的时候,能正确的在可用的Region中分配内存创建对象
  • 并发标记:从GC Roots开始对堆中的对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,重新处理SATB记录下的在并发时有引用变动的对象(并发
  • 最终标记:对用户线程做一个短暂的暂停,用于处理并发阶段结束后仍然遗留下来的最后的SATB记录
  • 筛选回收:负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制订回收计划,把决定回收的Region中的存活对象复制到空的Region中,再清理到整个旧的Region的全部空间

3.CMS和G1的比较

在未来CMS肯定会被G1取代,但是在这个两者并存的时代中,难免会有比较

  • G1相对于CMS的优点:指定最大停顿时间、分Region的内存分布、按收益动态的确定回收集、算法上的优势(整体基于标记-整理,局部基于标记-复制,这两种算法都不会产生内存空间碎片,垃圾收集完成之后能提供比较规整的可用内存)
  • G1相对于CMS的缺点:G1无论是为了垃圾收集产生的内存占用还是程序运行时的额外执行负载都比CMS要高

相关文章:

经典垃圾回收器

1.各垃圾回收器之间的配合使用关系 2.垃圾回收器的种类 2.1 Serial收集器(默认新生代收集器) Serial收集器是历史最悠久的收集器,曾经是新生代收集器的唯一选择,它是一个单线程工作的收集器,其“单线程”的意义不仅仅…...

台达DOP-B07S410触摸屏出现HMI no response无法上传的解决办法

台达DOP-B07S410触摸屏出现HMI no response无法上传的解决办法 台达触摸屏(B07S410)在上载程序时(显示No response from HMI)我以前的电脑是WIN7的,从来没出现过这样的问题,现在换成win10的,怎么都不行,(USB显示是一个大容量存储)换一台电脑(win10)有些行,有些不行…...

[资源推荐] 复旦大学张奇老师科研分享

刷B站的时候首页给我推了这个:【直播回放】复旦大学张奇教授亲授:人工智能领域顶会论文的发表指南先前也散漫地读了些许论文,但没有在一些宏观的方法论下去训练,读的时候能感觉出一些科研的套路,论文写作的套路&#x…...

C++数位动态规划算法:统计整数数目

题目 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2 min_sum < digit_sum(x) < max_sum. 请你返回好整数的数目。答案可能很大&…...

ip 网段设置 --chatGPT

问&#xff1a;host all all 127.0.0.1/32 scram-sha-256 里的 127.0.0.1/32 是什么含义 &#xff0c;要指定某个呢 gpt: 在 PostgreSQL 的 pg_hba.conf 文件中&#xff0c;127.0.0.1/32 是一个用于定义访问控制规则的CIDR&#xff08;无类域间路由&#xff09;标记&#xff0…...

使用JMeter进行接口测试教程

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Cho…...

文本生成解码策略

解码策略 1. sample实现了怎样的功能 不是直接选择概率最大的token&#xff0c;而是根据多项式分布进行采样获得下一个token 这里的概率通过设置一些策略&#xff0c;进行处理。例如&#xff0c;解码最小长度&#xff08;当长度小于该值的时候&#xff0c;eos的采样概率为0&am…...

华为数通方向HCIP-DataCom H12-831题库(单选题:221-240)

第221题 以下关于IS-IS的LSP分片功能的描述,正确的是哪一项? A、IS-IS的分片扩展功能的Mode-1模式,虚拟系统是需要参与路由SPF计算的 B、IS-IS的LSP分片功能,是用于让收到LSP分片报文的设备老化相关路由信息 C、IS-IS的分片扩展功能,是通过LSP报文中的LSPID实现的 D、IS-…...

AttributeError: module ‘hanlp.utils.rules‘ has no attribute ‘tokenize_english‘

附原文链接&#xff1a;http://t.csdnimg.cn/wVLib import hanlp tokenizer hanlp.utils.rules.tokenize_english tokenizer(Mr. Hankcs bought hankcs.com for 1.5 thousand dollars.) 改为&#xff1a; from hanlp.utils.lang.en.english_tokenizer import tokenize_eng…...

苍穹外卖(四) AOP切面公共字段自动填充及文件上传

一.AOP切面公共字段填充 问题分析 如果都按照上述的操作方式来处理这些公共字段, 需要在每一个业务方法中进行操作, 编码相对冗余、繁琐&#xff0c;那能不能对于这些公共字段在某个地方统一处理&#xff0c;来简化开发呢&#xff1f; 答案是可以的&#xff0c;我们使用AOP切…...

vue-cli + vue3 项目 ios 苹果手机白屏问题

目录 问题描述原因分析解决方案遇到的坑1&#xff0c;架构问题2&#xff0c;项目引入其他依赖的问题 参考 问题描述 vue-cli vue3 的项目&#xff0c;在苹果手机上打开白屏&#xff0c;安卓手机正常显示。 原因分析 1&#xff0c;借助 vconsole 发现并没有打印报错信息&…...

Spring Boot中的JdbcTemplate是什么,如何使用

Spring Boot中的JdbcTemplate是什么&#xff0c;如何使用 Spring Boot是一个流行的Java应用程序开发框架&#xff0c;它简化了Java应用程序的开发过程&#xff0c;并提供了丰富的功能和工具。在Spring Boot中&#xff0c;JdbcTemplate是一个强大的数据库访问工具&#xff0c;它…...

Python测网络连通性、能否访问某个网络或者端口号<网络检测、ping主机、测试端口>

一、ping命令及其使用 ping命令是在计算机网络领域中用来测试目标主机是否可达以及其延迟时间的命令。对于Python来说&#xff0c;我们可以通过subprocess模块来实现执行命令。下面是示例代码&#xff1a; import subprocessdef ping(host):result subprocess.run([ping, -c…...

【沧元图】玉阳宫主是正是邪,和面具人有勾结吗?现在已有答案了

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析沧元图。 沧元图这部动漫中&#xff0c;有一个很特殊的人物&#xff0c;也是一个让人看不透的人物&#xff0c;因为很多人都不知道这个人是正还是邪&#xff0c;这个人就是玉阳宫主。 因为这个人明面上是掌管东宁府维护东…...

C++笔记之popen()和std_system()和std_async()执行系统命令比较

C笔记之popen()和std_system()和std_async()执行系统命令比较 code review! 文章目录 C笔记之popen()和std_system()和std_async()执行系统命令比较1.popen()2.std::system()3.std::async()——C11提供的异步操作库&#xff0c;适合在多线程中执行外部命令&#xff0c;建议使…...

pycharm2020无法打开,点击无反应

pycharm 2020 无法打开&#xff0c;点击无反应&#xff0c;今天我碰到这现象&#xff0c;总结大体原因 C:\Users\ygw\AppData\Roaming\JetBrains &#xff08;删除该目录即可&#xff0c;一般由于升级安装 或 安装两个不同版本 会存在老旧文件影响导致&#xff09;...

深度学习之微调

在现代深度学习领域&#xff0c;精细调整&#xff08;Fine-tune&#xff09;已经成为一种非常重要的技术手段。 预训练模型 在介绍finetune之前&#xff0c;先了解一下什么是预训练模型。在搭建一个网络模型来完成一个特定的图像分类的任务时&#xff0c;首先&#xff0c;需要…...

【# 完美解决 node.js 模块化后报错 ReferenceError: require is not defined】

完美解决 node.js 模块化后报错 ReferenceError: require is not defined 错误信息如图 直接改插件源码&#xff1a;&#xff08;不是cnpm里的插件&#xff0c;而是下载下来的export2Excel.js&#xff09; 在export2Excel.js内只要改动头部一行源码即可 改之前&#xff1a;…...

Jackson忽略json数组中null元素

问题 前端传过来的json字符串中&#xff0c;其中json数组包含null字符。类型如下&#xff1a; ["0","1","2",null]这边Spring使用Jackson进行反序列化是会出现List对象中&#xff0c;包含null的数组元素。即List大小为4&#xff0c;本来List的…...

基于SpringBoot的网上订餐系统

基于SpringBoot的网上订餐系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;用户、管理员管理员&#xff1a;登录、个人中心、会员管理、…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...