JVM 垃圾回收算法详解

news2024/11/26 10:32:22

目录

  • 1 垃圾回收算法
    • 1.1 标记清除算法
    • 1.2 复制算法
    • 1.3 标记整理算法
    • 1.4 分代回收算法
      • 1.4.1 对象进入老年代的条件

1 垃圾回收算法

有四种垃圾回收算法:

  • 标记清除算法
  • 复制算法
  • 标记整理算法
  • 分代回收算法

1.1 标记清除算法

  • 标记:遍历内存区域,对需要回收的对象打上标记。
  • 清除:再次遍历内存,对已经标记过的内存进行回收。

注:蓝色的为存活对象
在这里插入图片描述
缺点:

  • 效率问题;遍历了两次内存空间(第一次标记,第二次清除)。
  • 空间问题:容易产生大量内存碎片,当再需要一块比较大的内存时,无法找到一块满足要求的,因而不得不再次出发GC。

1.2 复制算法

将内存划分为等大的两块,每次只使用其中的一块。当一块用完了,或经过一定时间,触发GC时,将该块中存活的对象复制到另一块区域,然后一次性清理掉这块没有用的内存。下次触发GC时将那块中存活的的又复制到这块,然后抹掉那块,循环往复。

优点:

  • 相对于标记–清理算法解决了内存的碎片化问题。
  • 效率更高(清理内存时,记住首尾地址,一次性抹掉)。

在这里插入图片描述
缺点:

内存利用率不高,每次只能使用一半内存,浪费空间。

1.3 标记整理算法

因为前面的复制算法当对象的存活率比较高时,这样一直复制过来,复制过去,没啥意义,且浪费时间。所以针对老年代提出了“标记整理”算法。

  • 标记:对需要回收的进行标记
  • 整理:让存活的对象,向内存的一端移动,然后直接清理掉没有用的内存。

如下图可以看到整理后对象都集中在一起,腾出连续的空间。
在这里插入图片描述

优点:不会产生碎片

缺点:每次标记再前移效率偏低

1.4 分代回收算法

分代回收算法本质是上述各算法的结合优化,当前大多商用虚拟机都采用这种分代回收算法。其实大多数对象生命周期非常短,所以在发生GC时,需要回收的对象特别多,存活的特别少,因此需要搬移到另一块内存的对象非常少,所以不需要1:1划分内存空间。而是将整个空间划分为新生代(1/3)和老年代(2/3)。新生代按照8 : 1 : 1的比例划分为三块,最大的称为Eden(伊甸园)区,较小的两块分别称为To SurvivorFrom Survivor(幸存者区或存活区)。

首次GC时,只需要将Eden存活的对象复制到To Survivor。然后将Eden区整体回收。再次GC时,将Eden和To存活的复制到Form Survivor,循环往复这个过程。这样每次新生代中可用的内存就占整个新生代的90%,大大提高了内存利用率。

但不能保证每次存活的对象就永远少于新生代整体的10%,有可能复制过去存不下,所以会有老年代作最后担保,若还不够就会抛出OOM。

堆空间的结构及详细回收流程如下

在这里插入图片描述

  • 堆空间被分成了新⽣代(1/3)和⽼年代(2/3),新⽣代中被分成了eden(8/10)、survivor1(1/10)、survivor2(1/10)

  • 对象的创建在eden,如果放不下则触发minor gc。(minor gc时,会触发 stop the world, 暂停其他用户线程,只让垃圾回收线程工作)。

  • 对象经过⼀次minorGC 后存活的对象会被放⼊到survivor区,并且年龄+1。如果在次执行minorGC,会统一挪到另一个survivor区。如果复制时存不下,则进入老年代。

  • 当survivor区中对象年龄到达15,进⼊到⽼年代。

  • 如果⽼年代内存都满了。会先尝试触发minor gc,再触发Full GC。Full GC执行过程中,STW的时间更长(因为老年代的存活数量比较多)。

  • 如果老年代满了且没有可回收的垃圾,会报OutOfmemory。

某个线程的内存溢出了而抛异常(out of memory),不会让其他的线程结束运行

这是因为当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行,进程依然正常

可以打开jdk自带的监视器查看内存分配情况:cmd窗口执行jvisualvm

流程图如下:

在这里插入图片描述

:不是只有幸存区对象年龄超过15才进入老年代,还存在很多其他复杂情况。

1.4.1 对象进入老年代的条件

  • 当遇到一个较大的对象时,就算新生代的伊甸园为空,也无法容纳该对象时,直接进入老年代:⼤对象可以通过参数设置大小,多⼤的对象被认为是⼤对象。-XX:PretenureSizeThreshold

  • 当对象的年龄到达15岁时将进⼊到⽼年代,这个年龄可以通过这个参数设置:-XX:MaxTenuringThreshold

  • 根据对象动态年龄判断,如果s区中的对象总和超过了s区中的50%,那么下⼀次做复制的时候,把年龄⼤于等于这次最⼤年龄的对象都⼀次性全部放⼊到⽼年代。

在这里插入图片描述

  • ⽼年代空间分配担保机制 :在minor gc时,检查⽼年代剩余可⽤空间是否⼤于新生代⾥现有的所有对象(包含垃圾)。如果⼤于等于,则做minor gc。如果⼩于,看下是否配置了担保参数的配置:-XX: -HandlePromotionFailure ,如果配置了担保,那么判断⽼年代剩余的空间是否⼩于历史每次minor gc 后进⼊⽼年代的对象的平均⼤⼩。如果是,则直接full gc,减少⼀次minor gc。如果不是,执⾏minor gc。如果没有担保机制,直接full gc。

    解释:说白了就是要判断下老年代的剩余空间,是否还能承受的住下一次新生代的对象存入老年代。

在这里插入图片描述

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

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

相关文章

AlexNet论文阅读

开始之前的简介:这篇论文是王林蓉师姐推荐给我看的第一篇入门级别的cv领域的论文,也算是我入手研究生阶段的第一篇论文.我是打算先看看这一领域的论文,然后写的自己一点随笔.若有错误欢迎指正. 一. 专有词汇 非饱和神经元 dropout 饱和非线性,非饱和非线性 二. 论文结构 三. 核…

10G SDH传输分析仪该如何选择

TFN D450S 传输分析仪 功能全面 使用方便 是 通信人的不二选择

深入了解企业税收违法信息API:实现智能风险评估

引言 企业税收违法是一项严重的经济犯罪,可能导致严重的法律后果和金融损失。为了帮助企业和金融机构识别并预防潜在的税收违法行为,智能风险评估变得至关重要。在这一领域,企业税收违法信息API发挥着重要的作用,提供了关键的数据…

一图读懂「五度情报站」全盘视野,情报智取,先知先行,决策有道!

「五度情报站」是一款集企业情报监测、管理、分析等多功能于一体微信小程序,其依托全体量产业大数据及强大的数据治理能力,收录了商业、市场、竞争、企业、技术、金融等全类别情报信息,构建了面向用户的业务型标签体系,设计了实用…

PyTorch深度学习实战(21)——从零开始实现Faster R-CNN目标检测

PyTorch深度学习实战(21)——从零开始实现Faster R-CNN目标检测 0. 前言1. Fast R-CNN 目标检测模型组成1.1 锚框1.2 区域提议网络1.3 分类和回归 2. 实现 R-CNN 目标检测2.1 数据处理2.2 模型构建2.3 模型训练与测试 小结系列链接 0. 前言 Faster R-CN…

手机抬手亮屏解锁,用到了哪些硬件?

随着时代发展,智能手机以丰富的功能及便利性,成为了人们必不可少的物品,其中人脸解锁功能是非常有用的功能,广受年轻人的喜爱,那么你知道她是如何实现吗?今天凡小亿带你们探索! 手机抬手亮屏解锁…

谨以此篇,纪念我2023年曲折的计算机保研之路

目录 阶段一:迷茫阶段二:准备个人意愿保研材料准备套磁老师5.1日 浙大线上编程测试5.8日 浙大线上面试 —— 一面5.17日 浙大线上面试——二面5.29日 实验室面试结果5.27日 南开线上面试6.20日 华师电话面试 阶段三:旅途北航CS(6.…

ebpf的快速开发工具--libbpf-bootstrap

基于ubuntu22.04-深入浅出 eBPF 基于ebpf的性能工具-bpftrace 基于ebpf的性能工具-bpftrace脚本语法 基于ebpf的性能工具-bpftrace实战(内存泄漏) 什么是libbpf-bootstrap libbpf-bootstrap是一个开源项目,旨在帮助开发者快速启动和开发使用eBPF(Extended Berk…

微服务拆分的思考

一、前言 前面几篇文章介绍了微服务核心的两个组件:注册中心和网关,今天我们来思考一下微服务如何拆分,微服务拆分难度在于粒度和层次,粒度太大拆分的意义不大,粒度太小开发、调试、运维会有很多坑。 二、微服务划分…

【初识Linux】:常见指令(2)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

为健康护航的小帮手,dido E55S Pro智能手表体验

现在很多年轻人每天都要长时间工作,没有时间锻炼身体,很容易导致各种健康隐患,工作效率也容易下降,非常有必要通过智能手表等工具,随时监测自己的健康状态。现在支持健康监测的智能手表非常多,用起来也简单…

Java反射使用实例

Java反射:解析类的秘密 Java反射是一项强大的功能,允许开发人员在运行时检查、操作和实例化类、方法、字段以及其他Java程序中的元素。这种能力赋予了Java语言更大的灵活性和动态性,但也需要慎重使用,因为它可能会导致性能问题和…

[Halcon检测] 划痕检测之高斯导数提取

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

带你了解小程序的框架之谜

🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《微信小程序 》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,…

BUUCTF学习(6): 命令执行ip

1、介绍 2、hackbar安装 BUUCTF学习(四): 文件包含tips-CSDN博客 ?ip127.0.0.1;ag;cat$IFS$9fla$a.php 空格过滤 $IFS$9 检查源代码 结束

ssm+vue的药品管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的药品管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

英语进阶指南:高效学习方法,提升英语水平 | 开源专题 No.35

这些开源项目集合了英语学习与翻译工具,包括英语进阶指南、多功能翻译工具、面向程序员的英语学习指南和单词记忆软件。它们提供实用方法,覆盖多个学习方面,满足不同需求。无论您是英语初学者还是想进一步提升,这些资源都能助您轻…

系列八、Redis的事务

一、是什么 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不允许加塞。 二、能干嘛 一个队列中,一次性、顺序性、排他性的执行一些列命令。 三、怎么玩…

3.Vue-在Vue框架中搭建路由

题记 以下是在vue框架中搭建路由的全过程,包括全部代码。 创建路由 如果你的文件中没有 router文件夹,可以使用以下命令创建: vue add router 注意:生成的路由文件会因为选择的自定义选项不同,而有所差异 生成的代码…

【ArcGIS Pro二次开发】(71):添加图层名称和路径到字段

如题,这个工具的目的就是将图层的名称和路径添加到字段值中。 有时候图层的名称和路径也是重要的信息,需要参与到字段的计算或是分析中,但是Arcgis Pro中没有一个方便的方法可以将其写入字段值,因此,就做了这么一个小…