一次JVM垃圾收集全过程

news2025/1/4 5:17:46

目录

JVM堆内存分配

JVM垃圾收集完整过程(带图解)


在介绍垃圾收集过程之前,有必要先对JVM堆内存做一个回顾,因为讲垃圾收集主要针对的是堆内存。

JVM堆内存分配

在JDK1.8之前,JVM堆内存主要分为新生代、老年代和永久代,而在1.8版本之后,永久代被元空间取代,元空间使用直接内存(如图1.1所示)。所以,在JDK1.8之后,在讲堆内存分配的时候,我们主要讲的是新生代和老年代,而新生代进一步可以分为Eden区和两个Survivor区,如图1.2所示。

图1.1

图1.2

针对新生代的垃圾回收称为Minor GC 或者 Young GC,针对老年代的垃圾回收称为Major GC 或者 Old GC,而针对所有的堆内存的垃圾回收称为Full GC。

这里有一点需要注意:通常Major GC和Full GC是等价的,当讲到Major GC的时候,一定要注意区分是仅针对老年代的Old GC 还是 Full GC。(那么,什么时候会触发Full GC 呢?答:历年晋升到老年代的平均对象大小大于老年代剩余空间;或者是如果有永久代,带永久代没有足够空间;或者是System.gc();或者是dump带GC时,都会触发Full GC。)

在新生代中,Eden区域和Survivor区域的内存大小比例为8:2,其中两个survivor(From Survivor和To Survivor,简称S0和S1)的空间大小相等,所以总的新生代内存分配比例为8:1:1。

JVM垃圾收集完整过程(带图解)

1. 对象优先在Eden区域分配 

我们都知道,在Eden能够容纳新生对象的时候,对象优先在Eden区域分配内存(先不考虑大对象),如图2.1所示。

图2.1

2. Eden区域满将进行Minor GC

在Eden区域无法容纳新生对象的时候,将会进行一次Minor GC(暂不考虑分配担保问题),如图2.2所示。

图2.2

 3. Minor GC使对象进Survivor区域

在进行一次Minor GC时,会将还存活的对象移动到其中一块Survivor区域(S0),并将对象的年龄加1,然后清理Eden区域未被引用的对象,如图2.3所示。

图2.3

4. 再一次Minor GC

经过第一次Minor GC后,Eden区域空了,对象又重新在Eden区域分配内存。当Eden再次满之后,注意 此时将Eden区域被引用的对象和S0中被引用的对象,移动到S1,然后年龄都加1,同时清理Eden和S0区域,如图2.4所示。

图2.4

5. Survivor区域在不断切换

然后再下一次Minor GC时,将重复同样的过程,只是这一次Survivor空间被切换了,如图2.5所示。

图2.5

6. 新生代对象晋升

在重复了几次Minor GC后,如果存活对象的年龄达到一定阈值(此处为8),则会将还存活的对象晋升到老年代,同时对象的年龄加1,如图2.6所示。

图2.6 

7. 新生代对象不断晋升

如果对象年龄达到年龄阈值,则不断会有新的对象晋升到老年代,如图2.7所示。

图2.7

8. 老年代Full GC

如果老年代满之后,最终则会进行一次Full GC,如图2.8所示。

图2.8 

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

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

相关文章

Kafka和Flink双剑合璧,Confluent收购Immerok引起业内广泛讨论

2023年开年开源界就出了一个大新闻,1月6日Kafka的商业化公司Confluent创始人宣布签署了收购 Immerok 的最终协议,而Immerok是一家为 Apache Flink 提供完全托管服务的初创公司,其创始团队正是Flink的创始团队。 无论是Kafka还是Flink&#x…

MQ 消息丢失、重复、积压问题,如何解决?

引入 MQ 消息中间件最直接的目的是:做系统解耦合流量控制,追其根源还是为了解决互联网系统的高可用和高性能问题。 系统解耦:用 MQ 消息队列,可以隔离系统上下游环境变化带来的不稳定因素,比如京豆服务的系统需求无论如…

你安全吗?丨生活中常见的黑产行为有哪

作者丨黑蛋电视剧《你安全吗?》我也追完了,到了终结篇。在结尾,网安黑产头子马平川终于因为陷害秦淮攻击虎迫系统被查出来就是虎迫内奸,随后也被一系列证据指出饮料厂等薅羊毛事件背后都有马平川的影子:今天我们就来聊…

python基础学习--数据类型、语句、函数

python的语法比较简单,采用缩进形式,如下: 在这里# print absolute value of an integer: a 100 if a > 0:print(a) else:print(-a)插入代码片以“#”开头的语句是注释。 注意:python是大小写敏感的,如果先写错了…

在线 OJ 项目(二) · 操作数据库 · 设计前后端交互的 API · 实现在线编译运行功能

一、操作数据库前的准备二、封装操作数据库数据的相关操作三、设计前后端交互的 API四、实现在线编译运行功能一、操作数据库前的准备 设计数据库表 我们需要对数据库中存储的题目进行操作. 创建一个 “题目表” oj_table 题目的序号 id. 作为题目表的自增主键。 标题 title.…

Android之常见的使用技巧

文章目录1.全局获取Context的技巧2.使用Intent传递对象Serializable方式Parcelable方式3.定制自己的日志工具4.深色主题5.Java和Kotlin代码之间的转换1.全局获取Context的技巧 在Android中,你会发现有很多地方都需要用到Context,例如:弹出To…

设计模式在项目中的运用

一、如何管理庞大而复杂的项目开发?1、从设计原则和思想的角度来看,如何应对庞大而复杂的项目开发?① 封装与抽象:“一切皆文件”:封装了不同类型设备的访问细节,抽象为统一的文件访问方式,更高层的代码就能…

windows下解决Git报错: LF will be replaced by CRLF the next time Git touches it

问题 在命令行执行git add *的时候,提示Warning: 通常情况下是在 Windows环境中才会遇到。 原因 Uinx/Linux采用换行符LF表示下一行(LF:LineFeed,中文意思是换行),即:\n&#xff1…

Visual Transformer开端——ViT及其代码实现

深度学习知识点总结 专栏链接: https://blog.csdn.net/qq_39707285/article/details/124005405 此专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器…

购买和登录Linux云服务器

目录 云服务器的购买 SSH登录云服务器 云服务器的购买 我们以腾讯云为例, 其他的服务器厂商也是类似。 1. 进入腾讯云官方网站:学生云服务器_云校园特惠套餐 - 腾讯云 (tencent.com) 2. 登陆网站(可以使用微信登陆) 3.购买云服务器 购买最低级即可,对于…

36/365 java 类的加载 链接 初始化 ClassLoader

1.类的加载,链接,初始化 注意点: Class对象是在类的加载过程中生成的(类的数据(static,常量,代码)在方法区,Class类对象在堆中),这个Class类对象作为方法区中…

Canvas 实现台球假想球精准定位

1. 前言 台球是一个让人非常着迷的运动项目,充满了各种计算逻辑,十分有趣。 对于初学者,母球、目标球、袋口三者在一条线上的时候,是非常容易进球的,但对于三者不在一条线上时,就是需要假想球的帮助&…

Windows 上安装 Insomnia 代替 Postman

Windows 上安装 Insomnia 代替 PostmanInsomnia 概述官网地址下载和安装 Insomnia使用 InsomniaInsomnia 概述 Insomnia 是一个开源桌面应用程序,它提供了设计、调试和测试API的简单方法。 通过对开发者友好的界面、内置的自动化和可扩展的插件生态系统&#xff0…

自动驾驶中间件:量产落地的关键技术

/ 导读 /对于初入自动驾驶行业的人来说,各色各样的新型传感器、线控系统、芯片域控制器、算法软件似乎是自动驾驶未来实现的重中之重,对于中间件大多数人可能都不太熟悉,有些甚至从未听说过其存在。但中间件却也是极为重要的一环,…

设计模式-创建型模式

目录 4.创建型模式 4.1 单例设计模式 4.1.1 单例模式的结构 4.1.2 单例模式的实现 4.1.3 存在的问题 4.1.4 JDK源码解析-Runtime类 4.2 工厂模式 4.2.1 概述 4.2.2 简单工厂模式 4.2.3 工厂方法模式 4.2.4 抽象工厂模式 4.2.5 模式扩展 4.2.6 JDK源码解析-Collecti…

Kotlin~生成器模式

介绍 主要作用 逐步构造复杂对象,该对象的属性更多的扩展属性,如Glide的使用。 组成 Builder:提供逐步创建产品的步骤 Director:创建可复用的特定产品(规定Builder规定一系列的步骤创建产品,非必须&…

21新版FL Studio水果电音编曲Daw宿主软件好不好用?

首先是FL Studio(以下简称FL)的逻辑和其它宿主软件都不太一样,FL的逻辑就与众不同。FL的逻辑也可以分为三部分:通道机架、混音台和播放列表。在Live里每个发送轨都可以插入一个乐器以及若干个效果器。你有200个发送轨,…

vcenter 起不来报错VMware ESX 找不到虚拟磁盘“vCenter Server 7.0U3_12.vmdk”。请确认路径有效并重试

针对无快照时丢失.vmdk描述符文件:基础磁盘文件为-flat.vmdk是存在的 那个可以进行恢复操作步骤如下1.确定 flat.vmdk基础磁盘文件的大小(字节)2.创建与flat.vmdk相同大小的新的空虚拟磁盘。3.重命名新创建的.vmdk磁盘的描述符文件匹配原始虚…

如何运行一个py项目

在pycharm中打开项目文件确保安装python环境此时是使用python3.7版本,没有的话需要添加环境:add interpreter在anaconda(安装参考https://blog.csdn.net/m0_67357141/article/details/123633490)中选择基础环境(base&a…

Python中的列表

1.创建列表 使用中括号把要添加的元素括起来,不同元素用逗号隔开。 >>> rhyme [1, 2, 3, 4, 5, "上山打老虎"] >>> print(rhyme) [1, 2, 3, 4, 5, 上山打老虎]2.访问列表中的元素 (1)希望顺序访问列表中的元…