[JVM]——垃圾回收

学习内容:

GC、垃圾回收器、垃圾回收算法

目录

一、GC垃圾回收算法

1.1 可达性分析法

1.1.1 GC ROOT对象:

1.1.3 四种引用方式:

⭐小结:

1.2 其他回收算法 

二、详解分代回收法:

三、垃圾回收器

3.1 串行垃圾回收器:

3.2 吞吐量优先回收器:

3.3 响应时间优先:

3.4 G1 garbage first


一、GC垃圾回收算法

1.1 可达性分析法

1. 标记可达对象 2. 回收不可达对象 

    也是虚拟机采用的方法,扫描所有的GC ROOT对象,如果对象能够被一个GC ROOT对象,直接或间接找到,那么它就可能不会被回收(这取决于引用类型),反之可回收。

1.1.1 GC ROOT对象:

指在Java虚拟机(JVM)的内存中,被直接或者间接引用的对象。这些对象被视为不可回收的,并且是垃圾收集器的根节点。它们的作用是为垃圾回收器提供一个初始的扫描位置,以便确定哪些对象是可达的,哪些对象是不可达的。垃圾回收器会从GC Root开始扫描,并标记所有可达对象,最终将不可达对象回收掉。

具体来说,GC Root对象主要包括以下几类:

  1. 虚拟机栈(栈桢中的本地变量表)中的引用的对象。
  2. 方法区中的类静态属性引用的对象。
  3. 方法区中的常量引用的对象。
  4. 本地方法栈中JNI(Java Native Interface)的引用的对象。

1.1.3 四种引用方式:

  •         强引用:通过GC ROOT直接或间接找到的,称为强引用,那么它也肯定不会被垃圾回收。
  •         软引用:没有被GC ROOT对象直接引用,当发生一次垃圾回收后内存不足就回收掉它。
  •         弱引用:也是没有被GC ROOT对象直接引用,不管内存足不足都会回收

如果引用的对象被回收了,那么该引用就会放入引用队列,可调用poll方法,回收引用队列里面的对象。

  •         虚引用:虚引用对应的是ByteBuffer直接内存,它不会被JVM直接回收掉,所以会有一个虚引用对象指向这快地址,从而当ByteBuffer对象被回收是,这快内存也会被回收。

  •         终结器引用:在垃圾回收时会先被放入队列,在由一个优先级较低的线程回收。

⭐小结:

    JVM通过可达性分析法找到引用对象,那些可以到达的对象是否被回收取决于何种引用,强引用一定不会被回收,软引用和弱引用根据JVM内存足不足判断是否回收。

1.2 其他回收算法 

  1. 标记-清除(Mark-Sweep)算法
    • 标记阶段:从根(GC ROOT)对象(如全局变量、栈中的变量等)开始,通过追踪对象之间的引用关系,标记所有可达的对象。
    • 清除阶段:遍历堆内存,清除未被标记的对象。此算法会产生内存碎片,影响内存的使用效率。
  2. 复制(Copying)算法
    • 将内存划分为大小相等的两块,每次只使用其中一块。当一块内存用完后,将存活的对象复制到另一块内存中,然后清除当前内存块的所有对象。
    • 此算法适用于对象存活率较低的场景,如新生代。但当存活对象较多时,复制效率会大大降低。
  3. 标记-整理(Mark-Compact)算法
    • 标记阶段与标记-清除算法相同。
    • 在清除阶段,不是直接清除对象,而是将所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
    • 此算法解决了内存碎片的问题,提高了内存的利用率。
  4. 分代收集(Generational Collection)算法
    • 根据对象的存活周期将内存划分为几块,如新生代和老年代。不同的区域采用不同的收集算法。
    • 新生代通常使用复制算法,因为新生代的对象存活率较低。老年代则采用标记-清除或标记-整理算法。
  5. 引用计数(Reference Counting)算法
    • 为每个对象维护一个引用计数器,当有新的引用指向对象时,计数器加1;当引用断开时,计数器减1。
    • 当计数器为0时,对象被视为垃圾,可以被回收。
    • 但此算法无法处理循环引用的问题,因此在Java中并未采用。

二、详解分代回收法:

JVM堆内存分为新生代区域和老年代区域,新生代又分为伊甸园和幸存区。

  1. 创建对象先在伊甸园分配空间,空间不足,发生minor gc
  2. minor gc:典型的复制算法,扫描一遍GC ROOT对象,标记可达对象,然后将对象复制到幸存区的一块区域(from或to),清空伊甸园内存,幸存区对象寿命+1
  3. 如果寿命足够大,就会放到老年代区域
  4. 如果minor gc时幸存区内存不够,会放入直接放入到老年代,如果老年代也不够了,会执行Full GC。
  5. 注意:如果大对象新生代内存不够,老年代够,它会直接放到老年代里面,不会触发GC。

小结:

新生代一般采用复制算法,老年代一般采用标记清除或整理算法

虚拟机参数:

三、垃圾回收器

3.1 串行垃圾回收器:

虚拟机参数设置:-XX:+UseSerialGC=Serial + SerialOld。

  1. Serial:工作在新生代区域,采用复制算法
  2. SerialOld:工作在老年代区域,采用标记-整理算法
3.2 吞吐量优先回收器:

虚拟机参数设置:-XX:+UseParallelGC,-XX:ParallerOldGC 

  1. Parallel Scavenge收集器
    • 是一款新生代收集器,基于标记复制算法。
    • 能够并行收集,以吞吐量优先。
  2. Parallel Old收集器
    • 是Parallel Scavenge收集器的老年代版本。
    • 使用多线程和“标记-整理”算法。

总结:开启多个线程,这取决于你的CPU核数,并行,用户线程不能执行

3.3 响应时间优先:
  1. ParNew收集器
    • 实质上是Serial收集器的多线程并行版本。
    • 可以同时采用多条线程进行垃圾处理,主要用于新生代。
  2. CMS(concur-mark-sweep)
    • 工作在老年代区域

执行步骤:

  1. 初始标记:标记GC Roots能直接关联到的对象,此过程速度很快,但仍然存在“Stop The World”问题,即在此阶段,其他线程需要暂停。
  2. 并发标记:进行GC Roots Tracing的过程,找出存活对象(直接或间接),同时用户线程可以并发执行
  3. 重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。此阶段同样存在“Stop The World”问题。
  4. 并发清除:对标记的对象进行清除回收。

虚拟机参数设置:-XX:+UseConcMarkSweepGC,-XX:UseParNewGC

总结:并发,只有初始标记和重新标记会有STW,其他阶段用户可并发执行,减少STW的时间,但是要预留空间给浮动垃圾,注意,当老年代中内存碎片过多,会退化为SerialOld做一次垃圾回收。

3.4 G1 garbage first

JDK1.9之后,默认的垃圾回收器

使用场景:

  • 同时注重吞吐量和低延迟,默认的暂停目标为200ms
  • 超大堆内存优势大,会将堆划分为多个大小相等的region
  • 整体上是标记+整理,两个区域之间是复制算法

相关参数:

  • -XX:+UseG1GC
  • -XX:G1HeapRegionSize=size
  • -XX:MaxGCPauseMillis=time

垃圾回收阶段:

G1这里我比较懵,大佬请移步请他文章。 

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

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

相关文章

人才测评,招聘视频制作影视设计师岗位的测评方案

常见的酷炫的视频,短视频,以及广告特效,年会中的各种片子,可以说各种各样的视觉盛宴,它们可都是出自影视后期的设计之手,尤其是当下短视频的兴起,抖音快速阿婆主,直播带货和主播&…

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了,还没push,如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1(等同于 git reset --mixed HEAD~1&#xff0…

二十二、软考-系统架构设计师笔记-真题解析-2018年真题

软考-系统架构设计师-2018年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.在磁盘调度管理中,应先进行移臂调度,再进行旋转调度。假设磁盘移动臂位于21号柱面上,进程的请求序列如下表所示。如果采用最短移臂调度算法,那么系统…

详解Python面向对象编程(一)

类和对象 面向过程——怎么做? (1)把完成某一需求的所有步骤、从头到尾,逐步实现 (2)根据开发需求,将某些功能独立的代码块封装成一个又一个的函数 (3)最后完成的代码&a…

【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 宠粉博主又来了,今天有粉丝问我如何实…

群晖NAS安装Video Station结合内网穿透实现公网访问本地影音文件

文章目录 1.使用环境要求:2.下载群晖videostation:3.公网访问本地群晖videostation中的电影:4.公网条件下使用电脑浏览器访问本地群晖video station5.公网条件下使用移动端(搭载安卓,ios,ipados等系统的设备…

GitHub加速访问最简单的方法

Github是全球最大的代码开源平台,对于编程的小伙伴来说,这是一个巨大的宝库,也是编程学习的圣地。很对小伙伴在使用GitHub时会经常出现无法访问Github的情况。 一、解决方法——>修改hosts文件 通过 IP查询工具来获取当前Github网站的真实…

Android14之深入理解sp模板类(二百零二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【机器学习】引领未来的力量:技术革新与应用探索

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图: 由点(node,或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树:特殊的图树,即连通无环图树的结点从根开始,层层扩展子树,是一种层次关系,这种层次关系&#xff0…

铁道障碍物检测6种YOLOV8

铁道障碍物检测6种,采用YOLOV8训练,得到PT模型,然后转换成ONNX模型,OPENCV调用 铁道障碍物检测6种YOLOV8

开发者的瑞士军刀:DevToys

DevToys: 一站式开发者工具箱,打造高效创意编程体验,让代码生活更加得心应手!—— 精选真开源,释放新价值。 概览 不知道大家是否在windows系统中使用过PowerToys?这是微软研发的一项免费实用的系统工具套…

css3鼠标悬停图片特效,图片悬停效果源码

特效介绍 css3鼠标悬停图片特效,图片悬停效果源码,可以在网页上面作为自己的动态加载名片,放到侧边栏或者网站合适的位置即可 动态效果 代码下载 css3鼠标悬停图片特效,图片悬停效果源码

解决mysql问题: this is incompatible with sql_mode=only_full_group_by

今天在部署一趟测试环境的服务,各种配置文件都配好了,启动服务后台报错,解决后记录一下,小伙伴们也可以看看! ### Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause…

代码随想录算法训练营第四十六天|139.单词拆分、56. 携带矿石资源(第八期模拟笔试)

139.单词拆分 刷题https://leetcode.cn/problems/word-break/description/文章讲解https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html视频讲解https://www.bilibili.com/video/BV1pd4y147Rh/?vd_sourceaf4853e80f89e28094a5fe1e220d9062 题解&…

C语言:给结构体取别名的4种方法

0 前言 在进行嵌入式开发的过程中,我们经常会见到typedef这个关键字,这个关键字的作用是给现有的类型取别名,在实际使用过程中往往是将一个复杂的类型名取一个简单的名字,便于我们的使用。就像我们给很熟的人取外号一样&#xff…

无人驾驶(移动机器人)路径规划之A star(Tie Breaker)算法及其matlab实现

在自动驾驶与移动机器人路径规划时,必定会用到经典的算法A star。下面是我未加入与加入Tie Breaker 的matlab实现效果。可以发现加入Tie Breaker之后效果明显改善。 目录 一、效果比较 1.未加入Tie Breaker(黑色为障碍物,菱形绿色为目标点…

python3游戏GUI--开心打地鼠游戏By:PyQt5(附下载地址)

文章目录 一.前言二.游戏预览1.启动2.开始游戏3.游戏结束4.排行榜 三.游戏思路四.总结 一.前言 第一次用PyQt做游戏,有点小紧张呢。本次使用PyQt5制作一款简单的打地鼠游戏,支持基本游戏玩法、…

Bytebase 签约 PropertyGuru,助力东南亚最大地产科技平台跨国多地数据库变更自动化

PropertyGuru 是东南亚最大的在线房地产平台,于2022年于纽交所📈上市,总部位于新加坡 🇸🇬。公司利用先进的技术,建立了一个连接多方的在线房产平台,一方面为中介代理商、开发商、银行等机构提供…

Kimi是什么?免费Kimi chat介绍

1. Kimi是什么? Kimi是由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手,专注于提供高质量的对话和信息处理服务。 月之暗面公司创立于2023年3月,创始团队核心成员参与了Google Gemini、Google Bard、盘古NLP、…