死磕P7: JVM垃圾回收那点事,轻松拿捏不是事儿(一)

这是「死磕P7」系列第 003 篇文章,欢迎大家来跟我一起 死磕 100 天,争取在 2025 年来临之际,给自己一个交代。

上两篇介绍了 JVM 内存区域划分,简单记忆一下就可以了,后面再不断深入吧。

死磕P7: JVM内存划分必知必会(一)-CSDN博客

死磕P7: JVM内存划分必知必会(二)-CSDN博客

今天我们开始来了解 JVM 垃圾回收相关的内容。

垃圾回收,最主要的位置就是 堆,JVM 为了垃圾回收的方便,将堆划分为了 2 大区域,分别是 年轻代 和 老年代,另外 1.8 之前还有 永久代,1.8 已经变成了元空间,知道一下就好了。

年轻代

有得文章也把它叫做新生代,年轻代是用来存放新生的对象,一般占据堆的 1/3 空间,由于频繁创建对象,所以新生代会频繁触发 MinorGC 进行垃圾回收。

年轻代又分为 Eden 区、SurvivorFrom、SurvivorTo 三个区,From, To 其实是交替使用的,所以我更喜欢直接叫 s0, s1, 反正你现在只需要记着 年轻代中又分为 3 个区就行,eden, s0, s1,并且他们的默认占比是 8:1:1.

Eden 区

Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代,这个大怎么划分的,先别管它)。

当Eden 区内存不够的时候就会触发 MinorGC,对新生代区进行一次垃圾回收。

除了 MinorGC 还有 MajorGC, FullGC:

  • MinorGC,发生在年轻代中的GC,Eden 区内存不够时发生

  • MajorGC,发生在老年代的 GC,出现 MajorGC 前要先进行 MinorGC,所以 MajorGC 一般经常伴有 MinorGC

  • FullGC,字面意思,Full,全部区域的 GC

FullGC 补充(先看 2 遍就好,知道一下,后面会再介绍到),什么时候发生呢?

  • 当老年代无法再分配内存的时候;

  • 元空间不足的时候;

  • 显示调用 System.gc 的时候;

  • 在 MinorGC 出现空间分配担保(见最下面的介绍)不足的时候也会发生 FullGC

Eden 区进行 MinorGC 时,将还存活的对象转移到 Survivor 其中一个区,如下图

SurvivorFrom

上面也说了,S0, S1 是交替进行转移的,上一次 GC 的幸存者 obj1 ,作为这一次 GC 的被扫描者, 所以 S0 将作为 From,S1 将作为 To,如下图

SurvivorTo

上面也说过了,S0, S1 交替作为 From 和 To,每次转移都会保证空出一个 S 区域,比如再 MinorGC 一次, S1 将作为 From, S0 将作为 To

不知道上面的 S0, S1, From, To 介绍清楚了没有,其实也介绍了 MinorGC 的基本流程。

MinorGC 采用的是 复制算法,Eden, S0, S1 面临的就是 复制->清空->互换 的过程。

关于垃圾清理算法,本篇先略过,后面会专门用一篇文章介绍,知道年轻代有 Eden,S0,S1 区域,并且 S0,S1 会交替被清空,来回复制即可。

年轻代中对象每经过一次 MinorGC,如果还存活的话,就会年龄+1,也就是说每次复制,如果不被删除,年龄就会增长一岁,如果达到阈值(默认15),就会转移到老年代。

老年代

老年代(年老代)主要存放应用程序中生命周期长的实例对象。老年代的对象比较稳定,所以 MajorGC 不会频繁执行。

在进行 MajorGC 前一般都先进行了一次 MinorGC,使达到年龄的新生代的对象晋身入老年代。

当无法找到足够大的连续空间分配给较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间。

老年代 GC 算法使用的比较混乱,下次专门介绍,先了解这么多。

重点回顾

对象优先在 Eden 区分配

大多数情况下(注意是大多数),对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Minor GC。

大对象直接进入老年代

大对象是指需要连续内存空间的对象,比如很长的字符串以及数组。

老年代直接分配的目的是避免在 Eden 区和 Survivor 区之间出现大量内存复制。

长期存活的对象进入老年代

虚拟机给每个对象定义了年龄计数器,对象在 Eden 区出生之后,如果经过一次 Minor GC 之后,将进入 Survivor 区,同时对象年龄变为 1 (上面介绍有图示),增加到一定阈值时则进入老年代(阈值默认为 15, 有特例,见下方)

动态对象年龄判定

为了能更好地适应不同程序的内存状况,虚拟机并不总是要求对象的年龄必须达到阈值才能进入老年代。

如果在 Survivor 区中相同年龄的所有对象的空间总和大于 Survivor 区空间的一半,则年龄大于或等于该年龄的对象直接进入老年代。

空间分配担保

在发生 Minor GC 之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象的空间总和,如果这个条件成立,那么 Minor GC 可以确保是安全的,如果不成立则进行 Full GC。

总结

本文主要介绍了 堆 空间的更细的划分方式,主要是从垃圾收集的角度进行划分。

堆是 JVM 面试最重要的部分之一,堆划分为 年轻代 和 老年代,为了方便垃圾回收,又把年轻代划分为了 Eden,S0, S1 区域,S0, S1 没有先后之分,它们 2 个的地位相同,就是来回替换用来存储未被清理,尚存活的对象。

老年代用来存放大对象及长期存活的对象,在老年代发生的 GC 是 MajorGC ,发生MajorGC 之前一般要先进行 MinorGC .

简单了解几点 FullGC 发生的场景即可,比如老年代无法分配内存,元空间内存不足,显示调用 GC 指令(一般也没人傻了吧唧的自己调吧),空间分配担保不成立时。

好了,今天的分享就到这里,关注公&号:新质程序猿,和我一起死磕 P7, 一起学习成长。

感谢大家的阅读,如果有任何异议的地方,欢迎指正,也欢迎大家+v: hyx2011 与我深入交流。

小福利

文末小福利,作为资深囤货达人,购置或转存了上千 T 的各种资源,反正我也学不完,如有需要,可以 hyx2011 找到我,直接送您,能帮助到大家也算是有所福报吧!

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

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

相关文章

php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号

有时候我们使用nginx 大家都知道平滑重启命令: /web/nginx/sbin/nginx -s reload 但大家对php-fpm 重启 可能就是简单暴力的kill 直接搞起了 下面介绍一个sh 文件名保存为start_php.sh 来对php-fpm 进行平滑重启 #!/bin/bash# 检查 PHP-FPM 是否运行 if ! pgrep php-…

常用并发设计模式精讲

1. 优雅终止线程的设计模式 思考:在一个线程 T1 中如何优雅的终止线程 T2? 正确思路:两阶段终止模式 1.1 两阶段终止(Two-phase Termination)模式——优雅的终止线程 两阶段终止(Two-phase Termination…

新160个crackme - 065-Eternal Bliss

运行分析 选择验证方式,破解字符串标题提示为vb程序 PE分析 VB程序,32位,无壳 静态分析&动态调试 使用VB Decompiler进行分析,发现Command1_Click_403604为check按钮事件,需要使Me 1 CBool(expression) 将表达…

CSS 中的文本相关属性(line - height、font、letter - 属性、text - 属性)

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与行高的取值约定 行高与盒子高度的关系 font、letter -属性 、text -属性 font属性 letter -属性 text - 属性 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与…

SQLI—LABS刷题 | SQL总结

Less1-2(联合注入) ?id1 查询到用户名及密码 ​​​​​​​?id1 报错:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 1 LIMIT 0,1 at li…

C++结尾

面试题 1.什么是虚函数?什么是纯虚函数 在定义函数时前面加virtual。虚函数是为了,父子类中只有一个该函数。如果在子类重写虚函数,那么用的就是子类重写的虚函数;如果子类没有重写虚函数,那么调用的是父类继承的虚函…

IP地址与5G时代的万物互联

5G时代,海量的设备将接入网络,从智能手机、平板电脑到智能家电、工业传感器等,每一个设备都需要一个独特的IP地址来进行标识和通信。可以说,IP地址就如同这些设备在数字世界中的“身份证”,确保它们能够准确地找到彼此…

vue嵌套路由刷新页面空白问题

问题描述 在vue项目开发中遇到这样一个问题,在history模式下通过页面点击路由跳转可以打开页面,但是在当前页面刷新就空白了,如下: 点击路由跳转页面是有的 刷新页面就空白 代码 {path: "/home",name: "home&qu…

PCIe6.0 AIC金手指和板端CEM连接器信号完整性设计规范

先附上我之前写的关于PCIe5.0金手指的设计解读: PCIe5.0的Add-in-Card(AIC)金手指layout建议(一)_pcie cem-CSDN博客 PCIe5.0的Add-in-Card(AIC)金手指layout建议(二)_gnd bar-CSDN博客 首先,相较于PCI…

vscode【实用插件】Code Runner 运行代码

安装 在 vscode 插件市场的搜索 Code Runner点 安装 使用 运行指定文件的代码 用 vscode 打开目标文件,右键快捷菜单运行即可 运行选中的代码 选中要执行的代码右键快捷菜单执行

配置树莓派打开SSH服务

在树莓派终端中查看IP 在终端中输入命令来查看IP地址。最常用的命令是:hostname -I注意,这里的参数I是大写的,它表示查看本机上所有配置的IP地址(包括IPv4和IPv6,如果有的话)。如果你只需要查看IPv4地址&am…

【NTN 卫星通信】基于NR的NTN RAN架构

1 引言 3GPP中,38.821协议中,研究了如何最大限度地减少对NG-RAN中新接口和协议的需求,以支持非地面网络。 研究了包括透传星和再生星的RAN架构。 2 基于透传星的NG-RAN架构 2.1 概述: 对于透传模式,卫星有效载荷在上行链路和下行链路方向上实现频率转换和射频放大器。它…

【Linux】环境变量(初步认识环境变量)

文章目录 1. 环境变量1.1 基本概念 2. 认识常见环境变量2.1 PATH2.2 HOME2.3 SHELL2.4 PWD2.5 USER 3. 理解环境变量 1. 环境变量 在main函数的命令行参数中,有argc、argv、env三个参数。 argc:命令函参数的个数argc:存放每个参数的具体数值…

SEO之页面优化(三、四——关键词标签与正文中的关键词)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 (接上一篇。。…

UnityHub下载任意版本的Unity包

1)先打开 // 也可以采用2直接打开 2)也可以直接打开 下载存档 (unity.com) 3)关联起来UnityHub即可

mysql—半同步模式

mysql的并行复制 在172.25.254.20(slave)主机上 默认情况下slave中使用的是sql单线程回放 在master中时多用户读写,如果使用sql单线程回放那么会造成组从延迟严重 开启MySQL的多线程回放可以解决上述问题 mysql> show processlist; 在配置文件中进行编辑 [root…

哪些因素会影响六西格玛效果的显现时间?

在探讨哪些因素会影响六西格玛效果的显现时间时,我们不得不深入剖析六西格玛管理方法的本质及其在企业中的实施过程。六西格玛作为一种旨在通过减少缺陷和变异来提高产品和服务质量的策略,其成功实施并非一蹴而就,而是受到多种复杂因素的共同…

<Rust>egui学习之部件(十二):如何添加右键菜单?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第十二篇…

AI+科研|| 如何使用Chat GPT撰写文献综述?7个步骤帮你轻松搞定!

撰写文献综述对许多研究人员和学生来说是一个耗时且复杂的过程。要做到内容全面且符合学术规范,往往需要大量的时间和精力。 然而,有了 ChatGPT 这样的智能工具,文献综述的撰写过程可以变得更加轻松高效。 今天,小编将通过7个简…

一键启动,停止,重启nginx

1.一键启动nginx 启动的时候只能启动当前目录的nginx.exe echo off echo 正在启动nginx cmd /c "start nginx.exe" timeout /t 1 /nobreak > NUL2.一键关闭nginx 关闭的时候只能关闭当前目录的nginx.exe echo off echo 正在关闭nginx cmd /c "nginx -s quit&…