垃圾回收器和垃圾回收机制(简单介绍,用于回忆总结)

news2024/11/22 22:28:51

文章目录

  • 垃圾回收机制
    • 1. 分代收集
    • 2. 标记复制
    • 3. 标记清除
    • 4. 标记压缩(整理)
  • 垃圾回收器
    • 1. Serial / Serial Old
    • 2. Parallel Scavenge
    • 3. ParNew收集器
    • 4. CMS收集器
    • 5. G1收集器
  • 参考链接

垃圾回收机制

1. 分代收集

  • 分代收集(Generational Collector)算法就是其中一种针对GC性能优化算法,将堆内存划分为新生代、老年代。
  • 在分代收集算法中,对象的存储具有以下特点:
    • 对象优先在 Eden 区分配。
    • 大对象直接进入老年代。
    • 长期存活的对象将进入老年代,默认为 15 岁。
  • 基本概念
    • 对象的生命周期:每经历一次GC,对象年龄 + 1。
    • 伊甸区:是对象诞生的地方。经过经验的推算,大部分对象的生命基本活不过1岁。
    • 生存区:活过了1岁,但大部分也活不到成年15岁。这些对象每经历一次 GC,会在 SA 和 SB 之间反复横跳。
    • 老年区:极少数成年的对象 或者 大对象会被一开始放在这儿。

2. 标记复制

  • 按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。
    在这里插入图片描述
  • 虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原本的一半。且存活对象增多的话,Copying算法的效率会大大降低。

3. 标记清除

  • 分为两个阶段:标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。
    在这里插入图片描述
  • 最大的问题是内存碎片化严重,后续可能发生大对象不能找到可利用空间的问题。

4. 标记压缩(整理)

标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。

在这里插入图片描述

垃圾回收器

1. Serial / Serial Old

  • Serial工作在新生代垃圾回收, Serial Old工作在老年代垃圾回收,一般作为CMS并发收集失败后的备选回收方案。
  • 当进行工作的时候,用户线程全部暂停,等它工作完成后,用户线程才允许继续工作。

简写: Serial收集器:全部暂停,直到收集结束。使用复制算法,响应速度快,没有线程交互开销,简单高效,额外内存消耗最小,适合用于单核cpu环境下client模式,体验会差一点,但只要不频繁发生收集,也可以接受。
在这里插入图片描述

2. Parallel Scavenge

  • ParNew收集器实质上是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之
    外,其余的行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一致,在实现上这两种收集器也共用了相当多的代码。

  • 特点:

    • 多线程
    • STW相对少点
    • 关注吞吐量,高效率利用CPU

3. ParNew收集器

  • 和Parallel Scavenge收集器一样,都是多线程进行回收,不过主要是和CMS收集器配合使用
    在这里插入图片描述

4. CMS收集器

  • CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非常符合这类应用的需求。
  • 垃圾回收过程:
    • 初始标记initial-mark):initial-mark 需要 Stop The World(简写为STW,就是停止所有用户线程),初始标记仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快。这个GC Roots 仅仅是老年代的 GC Roots ,同时初始标记不用去解决跨代引用(新生代引用老年代)问题,这个问题需要留在 remark 阶段去解决。暂停所有用户线程,只标记GC Roots直接引用的对象
    • 并发标记concurrent-mark):GC线程和用户线程同时工作,GC线程从gc goot开始遍历整个对象图
    • 重新标记remark):remark 阶段需要 STW,这个阶段会比 initial-mark 阶段要长,但远比 concurrent-mark 阶段要短。主要是为了标记前面并发阶段,用户线程继续运作而导致漏标、少标的对象。
    • 并发清理concurrent-sweep):concurrent-sweep 阶段不需要 Stop The World,上一阶段记录了本次 GC 的内存区域,标记整理算法并不用一一去回收已死对象,只需要把已死对象所在内存区域重新加入空闲列表即可。由于是和用户线程并发执行,这时新晋对象进入老年代所在的内存范围不在 GC 内存范围之内,所以它没被标记也不会被参与回收。
    • 并发重置concurrent reset):重新设置 CMS 相关的各种状态及数据结构,为下一个垃圾收集周期做好准备,将存活对象上的标记给移除掉,避免影响下次GC
  • 特点:
    • STW时间短
    • 产生浮动垃圾
    • 空间碎片(可以在清理后开启空间压缩处理)
    • 如果一直清理不干净,会导致频繁出现full GC最终导致并发收集失败,采用备选方案 Serial old单线程收集
  • CMS 很多阶段是和用户线程并发执行,这些阶段会源源不断有新的对象产生,从而触发 YGC,如果需要搬进老年代的对象大于老年代的可用空间,则会触发 Full GC。
    在这里插入图片描述

5. G1收集器

  • Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。全功能的垃圾收集器,主要面向服务端应用的垃圾收集器,具备较高吞吐率。
    在这里插入图片描述

  • 调整:

    • 在新生代和老年代的基础上,加了一个存放大对象的区域
    • 将整个内存区域全部划分成大小相同的网格(region),最多有2048个region
    • 每个region 都有可能存储新生代或老年代或大对象
    • 大对象的定义是超过region50%
    • 如果一个大对象存放不下,那么就跨越多个region存放
    • 可以通过参数控制停顿时间长短
  • 回收过程

    • 初始标记
    • 并发标记
    • 最终标记
    • 筛选回收
  • 特点

    • 并发和并行
    • 空间整合
    • 可预测的停顿

在这里插入图片描述

参考链接

CMS 垃圾回收器
G1垃圾回收器详解
JVM垃圾回收机制

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

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

相关文章

吉时利KEITHLEY 2657A源表keithley2651A数字源表

Keithley 2657A 源表是一款高电压、高功率、低电流源测量单元 (SMU) 仪器,可提供前所未有的功率、精度、速度、灵活性和易用性,以提高研发、生产测试和可靠性环境中的生产力。 Keithley 2657A SourceMeter 仪器专门设计用于表征和测试高压电子器件和功率…

【隐私计算篇】一种批量匿踪查询友好算法PIRANA的原理分析

1. 背景分析 前段时间开展了批量匿踪查询算法迭代优化的工作,取得了一些进展。不得不说,甲方爸爸永远会提出非常有挑战性的目标,push你去想各种解决方案。在实际的算法研发落地上,我们会结合算法本身的机制改进以及工程优化这两方…

力扣hot100--二叉树

目录 二叉树 1. 94. 二叉树的中序遍历 2. 98. 验证二叉搜索树 3. 101. 对称二叉树 二叉树 1. 94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示…

[ComfyUI]最好用的图像提示词反推工具发布 2.0 版本啦!更好用了!

图像提示词反推工具我也介绍了好一些了,但是架不住技术一直在迭代啊!过一段时间就出一个新的,或者是升级版,所以我们的分享也不能停! 前段时间 joy_caption 蛮火的,不过后来也陆陆续续出了一些比较好用的反…

JMeter性能测试时,如何做CSV参数化

在现代软件开发中,性能测试是保证应用程序在高负载条件下稳定运行的重要环节。为了实现真实场景的测试,参数化技术应运而生。其中,CSV参数化是一种高效且灵活的方法,可以让测试人员通过外部数据文件驱动测试脚本,从而模…

U-Boot阶段系统全量更新固件包制作杂记

背景:有一个在 U-Boot 阶段做系统全量自更新的需求,要制作系统的全量固件包(U-Boot.img、kerlen.img、rootfs.img)。大体分为三个主要部分:U-Boot-shell 脚本编写、打包各镜像为一个固件包、固件包的加密和解密 一、U…

电采暖集控系统陕西高陵体育馆应用项目案例

电采暖集控系统是一种集监测、控制和管理于一体的智能管理系统,旨在提高采暖效率、降低能耗和运营成本,同时提升用户的舒适度。该系统利用先进的计算机控制技术和系统集成技术,实现对电热采暖设备的集中管理和远程操控。 陕西高陵体育馆 是…

四川方维嘉术科技有限公司简介

四川方维嘉术科技有限公司 公司简介 四川方维嘉术科技有限公司成立于2023年,注册资本100万元整,位于中国西南地区的中心位置,是一家专注于供应医疗设备、高值耗材并提供医疗方面解决方案的企业。 【主要代理产品】 湖南瑞康通 &#xff1…

Alberta Wells数据集:首个包含超过213,000个油气井的大规模高质量基准数据集,它们是温室气体和其他污染物的重要来源,助力环境监测与气候变化。

2024-10-11,由Mila – Quebec AI Institute和McGill University等机构创建了首个大规模油井检测数据集,这个数据集的意义在于提供了一个工具,能够通过卫星图像识别和定位全球数以百万计的废弃油气井,这对于减少温室气体排放和保护…

数据结构与算法:堆与优先队列的深入剖析

数据结构与算法:堆与优先队列的深入剖析 堆是一种特殊的树形数据结构,广泛应用于优先队列的实现以及各种高效的算法中,如排序和图算法。通过深入了解堆的结构、不同堆的实现方式,以及堆在实际系统中的应用,我们可以掌…

使用js和canvas实现简单的网页打砖块小游戏

玩法介绍 点击开始游戏后,使用键盘上的←→控制移动,小球会不停移动,板子触碰小球时会反弹,碰撞到砖块时会摧毁砖块,如果没有用板子接住小球就游戏失败 代码实现 代码比较简单,直接阅读注释即可&#x…

工作日志:elementplus上传图片问题

问题&#xff1a;打开弹窗&#xff0c;上传一张照片后&#xff0c;关闭再打开&#xff0c;之前上传的图片仍在列表里展示。 然后添加了几行代码&#xff0c;报错。 <el-upload list-type"picture-card":limit"1":on-success"handleAvatarSuccess&…

Spring Boot 之三大配置文件.properties、.yml、.yaml 及其优先级解析

Spring Boot 的强大之处在于其高度可配置性&#xff0c;允许开发者根据不同环境和需求定制应用程序的行为。而这一切的核心便是配置文件。Spring Boot 支持多种配置文件格式&#xff0c;其中最常用的三种是 .properties、.yml 和 .yaml。 1. .properties&#xff1a;传统方式 …

基于NXP LS1023+FPGA的嵌入式解决方案

基于 NXP公司的LS1043A高性能64位ARM四核处理器。 LS1043A处理器是NXP公司面向嵌入式网络推出的一款四核64位ARM处理器&#xff0c; 支持无风扇设计的灵活I/O封装&#xff0c; 提供超过10 Gbps的性能&#xff0c;是专为小规格网络和工业应用而设计的解决方案。全新23x23封装方式…

jquery实现点击菜单实现高德地图定位点与数据展示联动效果

&#x1f34a;jquery实现点击菜单实现高德地图定位点与数据展示联动效果 版本介绍&#xff1a; jQuery v3.7.1高德地图JS API 2.0 代码仓库 ⭐ Gitee&#xff1a;实现点击菜单实现高德地图定位点与数据展示联动效果 1.启动说明 &#x1f4d4; 推荐VS Code编辑器插件Live Ser…

java项目之信息化在线教学平台的设计与实现(源码+文档)

项目简介 信息化在线教学平台的设计与实现实现了以下功能&#xff1a; 信息化在线教学平台的设计与实现的主要使用者管理员功能有个人中心&#xff0c;学生信息管理&#xff0c;教师信息管理&#xff0c;教学信息管理&#xff0c;学生成绩管理&#xff0c;留言板管理&#xf…

29.数据结构与算法-查找-查找的基本概念

查找的基本概念 查找表 主关键字与次关键字 查找是否成功 查找的目的&#xff08;查询&#xff0c;检索&#xff0c;插入&#xff0c;删除&#xff09; 查找表的分类&#xff08;静态查找表&#xff0c;动态查找表&#xff09; 如何评价查找算法&#xff08;平均查找长度ASL&a…

前端编程艺术(5)---Vue3(从零基础到项目开发)

目录 1.Vue.js 2.快速上手 2.数据响应式 1.reactive函数 2.ref函数 3.Vue工程化 1.安装node.js 2.脚手架创建项目 3.项目setup 4.vue指令 1.内容渲染指令 2.属性绑定指令 3.事件绑定指令 4.条件渲染指令 5.列表渲染指令 6.双向绑定指令 7.指令修饰符 8.样式绑…

[JAVAEE] 创建线程的方法 + Thread类中的常用方法 + 线程状态

目录 一. 创建线程的方法 1.1 继承 Thread 类. 1.2 实现 Runnable 接口. 1.3 lambda表达式创建线程 二. Thread类中的常用方法 2.1 start方法 2.2 run方法 2.3 sleep静态方法 2.4 isDaemoon() and setDaemon() 2.5 isAlive() 2.6 Thread.currentThread() 2.7 inter…

anzocapital:交易量对止损和止盈策略的影响

在金融市场中&#xff0c;交易量的波动对交易策略有着深远的影响。anzocapital作为一家专业的金融服务提供商&#xff0c;深知交易量对止损和止盈策略的重要性。大额交易订单往往优先执行&#xff0c;这可能导致EA设置的小止损和小止盈在实际操作中出现偏差。 以市场开盘为例&…