图解 Java 垃圾回收机制,写得非常好!
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试资料
原文:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
译文:https://www.oschina.net/translate/java-gc
翻译:Rhys_Lee, AzureSora, 溪边九节, 小小菜鸟鸡
什么是自动垃圾回收?
自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。
所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。
在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。
第一步:标记
垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。
上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步可能会相当耗时间。关注Java技术栈微信公众号,回复:JVM46,可以获取一份超全 JVM 调优攻略。
第二步:清除
这一步会删掉标记出的未引用对象。
内存分配器会保留指向可用内存的引用,以供分配新对象。
压缩
为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。
为什么需要分代垃圾收集?
之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。JVM 与 Linux 的内存关系详解,这篇推荐阅读。
来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间)
上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。
JVM 分代
根据之前的规律,就可以用来提升 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中的对象分配和老化过程。关注Java技术栈微信公众号,回复:JVM46,可以获取一份超全 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,清理并最终压缩该空间。
热门内容:
一个员工的离职成本到底有多恐怖!
Tomcat 和 JVM 的性能调优总结
Java 性能优化:教你提高代码运行的效率
感受lambda之美,推荐收藏,需要时查阅
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!
聊聊前后端分离接口规范
RESTful 架构基础
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
图解 Java 垃圾回收机制,写得非常好!相关推荐
- 图解 Java 垃圾回收机制,看了都说好
点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 If you concentrate on the ONE thing in ...
- 图解 Java 垃圾回收机制
原文:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 译文:https://www.os ...
- [译文] 图解 Java 垃圾回收机制
点击蓝色"小哈学Java"关注我哟 加个"星标",第一时间获取小哈推送的文章哦! 原文:https://www.oracle.com/webfolder/tec ...
- 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垃圾回收机制算法 标记----清除算法 复制算法 标记----整理算法 分代收集算法 为什么要进行垃圾回收 因为当一个对象的引用不可达,或者一个对象没有任何引用指向它,那么它就没有必要在内存中 ...
- axis2 webService开发 附深入理解 Java 垃圾回收机制
相关文章: axis web服务(axis2安装和eclipse.tomcat结合开发) axis2 webService开发 axis2 webService开发(打包aar文件) 使用Axis2开 ...
- [JVM]成为JavaGC专家(1)—深入浅出Java垃圾回收机制
对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信一个 ...
- 理解 Java 垃圾回收机制
理解java垃圾回收机制有什么好处呢?作为一个软件工程师,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java应用程序. 这是我个人的主观观点,但我相信一个 ...
最新文章
- 外媒:英国索尔兹伯里事件中受伤警察已重返工作
- DLX (Dancing Links/舞蹈链)算法——求解精确覆盖问题
- 读完这篇文章,就基本搞定了Redis数据库
- 您在2016年会做什么? Apache Spark,Kafka,Drill等
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现
- Android开发笔记(一百四十五)仿应用宝的垃圾清理动画
- webpack的安装
- 漫画:如何求图的最短路径? | 技术头条
- 计算机专业课如何阅卷,全国计算机等级考试评卷老师是如何阅卷的?
- GooFlow .net 工作流程图 jquery 流程 mvc
- 机载Lidar数据滤波方法研究
- ios功耗测试软件,iOS 性能优化 Instruments 检测 App 耗电量实战
- 用Java实现圆锥的体积公式_圆锥的体积公式及其推导
- 柱形图配色丨细节问题
- cf服务器显示空白,cf空白名(cf显示空白的生僻字)
- PPT到WORD的组合图片复制
- Unity导入Mixamo动画,合并Mixamo动作
- python---基础知识回顾(三)(面向对象)
- ROS2 第一个C++程序(talker和listener为例)
- 国密算法(SM2,SM3,SM4)辅助工具升级版(OTP+PBOC3.0)