Java 垃圾回收机制,13张图给你讲清楚!
作者:Rhys_Lee 等等等
https://blog.csdn.net/zl1zl2zl3/article/details/90904088
什么是自动垃圾回收?
第一步:标记
第二步:清除
压缩
为什么需要分代垃圾收集?
JVM 分代
世代垃圾收集过程
什么是自动垃圾回收?
自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。
所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。
在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。
第一步:标记
垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。
上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步可能会相当耗时间。
第二步:清除
这一步会删掉标记出的未引用对象。
内存分配器会保留指向可用内存的引用,以供分配新对象。
压缩
为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。
为什么需要分代垃圾收集?
之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。
不过,根据统计,大部分的对象,其实用没多久就不用了。
来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间)
上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。
JVM 分代
根据之前的规律,就可以用来提升 JVM 的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老年代,以及永生代。
新对象会被分配在新生代内存。一旦新生代内存满了,就会开始对死掉的对象,进行所谓的小型垃圾回收过程。
一片新生代内存里,死掉的越多,回收过程就越快;至于那些还活着的对象,此时就会老化,并最终老到进入老年代内存。
Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。
在这种事件发生时,所有的程序线程都要暂停,直到事件完成(比如这里就是完成了所有回收工作)为止。
老年代用来保存长时间存活的对象。通常,设置一个阈值,当达到该年龄时,年轻代对象会被移动到老年代。
最终老年代也会被回收。这个事件成为 Major GC。
Major GC 也会触发STW(Stop the World)。通常,Major GC会慢很多,因为它涉及到所有存活对象。
所以,对于响应性的应用程序,应该尽量避免Major GC。还要注意,Major GC的STW的时长受年老代垃圾回收器类型的影响。
永久代包含JVM用于描述应用程序中类和方法的元数据。永久代是由JVM在运行时根据应用程序使用的类来填充的。此外,Java SE类库和方法也存储在这里。
如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。
世代垃圾收集过程
现在你已经理解了为什么堆被分成不同的代,现在是时候看看这些空间是如何相互作用的。后面的图片将介绍JVM中的对象分配和老化过程。
首先,将任何新对象分配给 eden 空间。两个 survivor 空间都是空的。
当 eden 空间填满时,会触发轻微的垃圾收集。
引用的对象被移动到第一个 survivor 空间。清除 eden 空间时,将删除未引用的对象。
在下一次Minor GC中,Eden区也会做同样的操作。删除未被引用的对象,并将被引用的对象移动到Survivor区。然而,这里,他们被移动到了第二个Survivor区(S1)。
此外,第一个Survivor区(S0)中,在上一次Minor GC幸存的对象,会增加年龄,并被移动到S1中。
待所有幸存对象都被移动到S1后,S0和Eden区都会被清空。注意,Survivor区中有了不同年龄的对象。
在下一次Minor GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S0,。幸存的对象增加年龄。Eden区和S1被清空。
此幻灯片演示了 promotion。在较小的GC之后,当老化的物体达到一定的年龄阈值(在该示例中为8)时,它们从年轻一代晋升到老一代。
随着较小的GC持续发生,物体将继续被推广到老一代空间。
所以这几乎涵盖了年轻一代的整个过程。最终,将主要对老一代进行GC,清理并最终压缩该空间。
长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢
Java 垃圾回收机制,13张图给你讲清楚!相关推荐
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- 深入理解 Java 垃圾回收机制
转载自 http://www.cnblogs.com/andy-zcx/p/5522836.html 深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入 ...
- 【Java】Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- axis2 webService开发 附深入理解 Java 垃圾回收机制
相关文章: axis web服务(axis2安装和eclipse.tomcat结合开发) axis2 webService开发 axis2 webService开发(打包aar文件) 使用Axis2开 ...
- 理解 Java 垃圾回收机制
理解java垃圾回收机制有什么好处呢?作为一个软件工程师,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java应用程序. 这是我个人的主观观点,但我相信一个 ...
- Java垃圾回收机制与垃圾收集器
Java垃圾回收机制与垃圾收集器 前言 判定对象是否存活(标记) 引用计数法 可达性分析 算法思想 算法步骤 对象复活 引用概念的完善 垃圾回收算法 标记 - 清除法 标记 - 复制法 标记 - 整理 ...
- 深入理解Java虚拟机:Java垃圾回收机制
本篇内容包括:JAVA 垃圾回收机制概述.有哪些内存需要回收.如何回收(标记-清除.标记-整理(标记-清除-压缩).复制(标记-复制-清除).分代收集等算法) 以及 何时进行垃圾回收等内容! 一.概述 ...
- 【JVM】Java垃圾回收机制(GC)详解
Java垃圾回收机制(GC)详解 一.为什么需要垃圾回收? 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配不回收,但是事实并非如 ...
- java 垃圾回收机制的理解
1.垃圾回收的意义 在java体系中内存的分和回收是自动化管理的,从而程序员不需要操心内存的分配和是否浪费.javaGC机制能帮我们把不需要的对象占用的内存回收,保证程序高效的运行.由于我们创建的对象 ...
- 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC
36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...
最新文章
- Android studio 使用心得(三)—从Eclipse迁移到Android studio
- 这个GitHub 1400星的Git魔法书火了,斯坦福校友出品丨有中文版
- 深入理解计算机系统(2.6)------整数的运算
- jQuery的Cookie使用
- fukk _GNU_SOURCE __USE_GNU
- NUC1840 Graveyard Design【尺取法】
- echarts 雷达图_【带着canvas去流浪】绘制雷达图
- “敏捷开发”怎么就“敏捷”了
- 如何在magento后台增加一个自定义订单状态
- JCreator使用技巧
- 计算机组成原理:超标量,让CPU的吞吐率超过1
- Libmodbus 移植
- 微信小程序之组件的四种传值方式
- OpenCV-RGB转HSV
- 2022高处安装、维护、拆除考试题库及模拟考试
- 终于等来了十一长假,当然要戴上你去这些美到哭的地方
- MOBA手游《小米超神》案例精讲
- 计算机性能低玩游戏卡顿,Win7电脑玩游戏很卡和FPS帧数太低的优化方法
- 微信公众号之渲染静态模板
- 数据埋点是什么?设置数据埋点的意义?
热门文章
- poj2186(强连通分量)
- HDU1285拓扑排序模版题
- 【第一道计算几何题】 UVA11178 Morley‘s Theorem (二维几何,旋转直线求求交点)
- Educational Codeforces Round 93 (Rated for Div. 2) 题解
- 559.N叉树的最大深度
- Java服务提供_JAVA 服务提供者框架介绍
- iOS 动画之CoreAnimation(CALayer)
- 安防企业如何应对市场发展新机遇
- springboot(十六):使用Jenkins部署Spring Boot
- OpsDev是什么?