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

news2024/12/29 11:04:05

这是「死磕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.coloradmin.cn/o/2170064.html

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

相关文章

Spring邮件发送:配置与发送邮件详细步骤?

Spring邮件发送教程指南?怎么用Spring邮件发送服务? Spring框架提供了强大的邮件发送支持,使得开发者能够轻松地在应用程序中集成邮件发送功能。AokSend将详细介绍如何在Spring应用中配置和发送邮件,帮助开发者快速掌握这一关键技…

浙大数据结构:06-图2 Saving James Bond - Easy Version

这道题是稍复杂版的dfs或bfs,此处我采用bfs实现 机翻: 1、条件准备 n为鳄鱼数量,jump为跳一次最大距离。 eyu数组对存每条鳄鱼的坐标位置,visit数组判断该鳄鱼是否走过,isalive判断到达该鳄鱼时能否逃离。 #includ…

探索图像生成大模型Imagen:原理、比较与应用

目录 目录 1. 引言 2. 图像生成模型的发展背景 2.1 生成对抗网络(GAN) 2.2 变分自编码器(VAE) 2.3 自回归模型 2.4 扩散模型 3. Imagen简介 3.1 模型架构 3.2 关键技术 3.3 训练数据与方法 4. Imagen与其他模型的比较 …

ArcGIS Pro高级地图可视化—双变量符号地图

ArcGIS Pro高级地图可视化 ——双变量符号地图 1 背景 “我不是双变量,但我很好奇。”出自2013 年南卡罗来纳州格林维尔举行的 NACIS 会议上,双变量地图随着这句俏皮的话便跳跃在人们的视角下,在讨论二元映射之后,它不仅恰逢其…

AOT源码解析4.5-AOT整体结构

论文阅读 papergithub论文阅读笔记AOT源码解析1-数据集处理AOT源码解析2-encoderdecoderAOT源码解析3-模型训练AOT源码解析4.1-model主体AOT源码解析4.2-model主体AOT源码解析4.3-model主体AOT源码解析4.4-model主体AOT源码解析4.5-model主体 4.1~4.4小节详细讲解了ref_imgs相…

15年408-数据结构

第一题 解析: 栈第一次应该存main的信息。 然后进入到main里面,要输出S(1),将S(1)存入栈内, 进入到S(1)中,1>0,所以还要调用S(0) S(0)进入栈中,此时栈内从下至上依次是main(),S(1),S(0) 答案选A 第二题&…

Java基于相似算法实现以图搜图

一、简述 本文主要讲如何利用图片相似性算法&#xff0c;基于LIRE来实现图片搜索。 二、依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --><dependency><groupId>org.apache.lucene</groupId><…

Apache Solr:深入探索与常见误区解析

Apache Solr&#xff1a;深入探索与常见误区解析 Apache Solr 是一个强大的搜索引擎&#xff0c;基于 Lucene 构建&#xff0c;广泛应用于电商平台、日志分析、内容管理系统等领域。Solr 的功能强大&#xff0c;然而它的配置和使用过程却不乏一些容易误解和出错的地方。本文将…

Spring validation校验框架

第1步&#xff1a;导入依赖 <!-- 校验框架--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 第2步&#xff1a;为需要校验的参数&…

Leetcode 739.42. 每日温度 接雨水 单调栈 C++实现

问题&#xff1a;Leetcode 739. 每日温度 算法1&#xff1a;从右到左 栈中记录下一个更大元素的「候选项」。 代码&#xff1a; class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();vector<…

【echarts】报错series.render is required.

总结&#xff1a;就是echarts无法保存renderItem函数到json里&#xff0c;因为renderItem是个封装方法&#xff0c;因此需要初始化加载时重新插入renderItem即可 1.描述&#xff1a;控制台报错series.render is required. 原数据json如下&#xff1a; {type: "bar"…

【数学分析笔记】第3章第4节闭区间上的连续函数(2)

3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.4 中间值定理 【定理3.4.4】若 f ( x ) f(x) f(x)在 [ a , b ] [a,b] [a,b]上连续&#xff0c;则它一定能取到最大值 M M M与最小值 m m m之间的任何一个值。 M max ⁡ f ( x ) , x ∈ [ a , b ] , m min ⁡ f ( x ) , …

Vmware 静态ip配置

虚拟机网络设置NAT 查看当前的网络接口 ip addr编辑网络接口配置文件 sudo vi /etc/sysconfig/network-scripts/ifcfg-<接口名>配置静态 IP 地址 Vmware ➡ 编辑 ➡ 虚拟网络编辑器 ➡ Nat设置 参考上图进行配置&#xff0c;千万不要配置宿主机的配置 BOOTPROTOstat…

2023_Spark_实验十一:RDD基础算子操作

一、RDD的练习可以使用两种方式 使用Shell使用IDEA 二、使用Shell练习RDD 当你打开 Spark 的交互式命令行界面&#xff08;也就是 Spark shell&#xff09;的时候&#xff0c;它已经自动为你准备好了一个叫做 sc 的特殊对象&#xff0c;这个对象是用来和 Spark 集群沟通的。你…

女性在网络安全行业崛起,引领行业新风向

1、网络安全自诞生之日起&#xff0c;就与女性有着不解之缘。 ●二战期间&#xff0c;美国雇佣了1万名女性作为“密码女孩”来破译日本人和德国人发送的密信。 ●英国同样雇用了7000多名女性在英国密码分析中心工作&#xff0c;约占全部工作人员的四分之三。 ●世界上的第一…

108.游戏安全项目:信息显示二-剑侠情缘基址分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信…

spring-boot web + vue

依赖的软件 maven 1. 官网下载zip 文件&#xff0c;比如apache-maven-3.9.9-bin.zip 2. 解压到某个盘符&#xff0c;必须保证父亲目录的名字包含英文&#xff0c;数字&#xff0c;破折号&#xff08;-&#xff09; 3. 设置环境变量M2_HOME, 并将%M2_HOME%\bin添加到windown…

openpnp - 散料飞达不要想着做万能版本,能够贴合现有的物料就好

文章目录 openpnp - 散料飞达不要想着做万能版本&#xff0c;能够贴合现有的物料就好概述笔记天真的版本改进的版本物料编带标准物料编带的样式对于散料飞达关心的尺寸不同编带宽度的散料飞达关键尺寸的列表8mm物料编带12mm物料编带16mm物料编带24mm物料编带32mm物料编带44mm物…

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

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

FPGA学习(1)-mux2,2选1多路器

目录 1 开发板配套资料 1.1学习网址和资料网址 2.创建工程文件 2.1创建过程 2.2写程序及仿真测试 2.2.1 写程序生成电路 2.2.2仿真 2.2.3 生成执行文件并烧录 3.实验现象 买的小梅哥店铺的开发板&#xff1a;xc7z020clg400 看的小梅哥的视频&#xff1a;03C _基于ZYN…