点击蓝色“小哈学Java”关注我哟

加个“星标”,第一时间获取小哈推送的文章哦!


原文: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 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。

来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间)

上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。

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,清理并最终压缩该空间。

免费无套路分享 | 面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心知识&面试.pdf》,内容覆盖很广,Java 核心基础、Java 多线程、高并发、Spring、微服务、Netty 与 RPC、Zookeeper、Kafka、RabbitMQ、Habase、设计模式、负载均衡、分布式缓存、Hadoop、Spark、Storm、云计算等

获取方式: 关注本公众号: 小哈学Java, 后台回复资源,既可免费无套路获取资源链接哦!

更多推荐内容

↓↓↓

一文教您如何通过 Docker 搭建 Ngnix,反向代理,并配置 Https 证书

面试官:大数据量sql分页查询很慢,有哪些优化方案?

面试题:谈谈 Redis 热点 Key 如何发现,解决方案有哪些

一文带您了解常用Json库中,哪种性能最出色

面试官:说说看,线上发生Mysql死锁,你的排查思路?

如何优雅地生成那些花里胡哨的复杂样式 Excel 文件?

为什么阿里巴巴代码规约要求避免使用 Apache BeanUtils 进行属性复制

一文教您通过 Docker 快速搭建各种测试环境(Mysql, Redis, ES, MongoDB) | 建议收藏

如果你喜欢本文

请长按二维码,关注小哈学Java

转发朋友圈,是对我最大的支持哟

如果你喜欢这篇文章,在看,转发吧。

相信明天更加美好 (*^__^*) 

[译文] 图解 Java 垃圾回收机制相关推荐

  1. 图解 Java 垃圾回收机制,写得非常好!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 原文:https://www.oracle.com/webfold ...

  2. 图解 Java 垃圾回收机制

    原文:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 译文:https://www.os ...

  3. 图解 Java 垃圾回收机制,看了都说好

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 If you concentrate on the ONE thing in ...

  4. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  5. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  6. java垃圾回收机制_JVM的垃圾回收机制——垃圾回收算法

    一.Java垃圾回收机制 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行.在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者 ...

  7. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  8. 深入理解 Java 垃圾回收机制

    转载自 http://www.cnblogs.com/andy-zcx/p/5522836.html 深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java  语言中一个显著的特点就是引入 ...

  9. java垃圾回收机制的理解

    Java垃圾回收机制算法 标记----清除算法 复制算法 标记----整理算法 分代收集算法 为什么要进行垃圾回收 因为当一个对象的引用不可达,或者一个对象没有任何引用指向它,那么它就没有必要在内存中 ...

最新文章

  1. iOS 根据中文字符串排序出字母索引
  2. AndroidStudio开发jni不加载libs的so,只加载jniLibs的so
  3. Android之如何以最简单方式开启闪光灯
  4. Android-NDK-EGL
  5. 往年程序员是怎样过“1024程序员节”的!程序员,今年又准备怎么过?
  6. linux删除目录tmpab是什么意思_linux 下tmp目录文件怎么被删除的?
  7. ES6学习笔记九(函数的扩展)
  8. java httpclient 进度条_java – 如何使用Apache HttpClient 4获取文件上传的进度条?
  9. 桌面 计算机 win7,计算机动态桌面,教您如何在win7中设置计算机动态桌面
  10. Linux编程基础之Makefile的使用
  11. UEFI开发探索50 – UEFI与网络2
  12. 5336: [TJOI2018]party
  13. %f 与 %lf的区别
  14. java针刺治疗尿潴留,针刺治疗尿潴留52例疗效观察
  15. SQL数据库查询语句
  16. VASP MAGMOM设置
  17. 20句任正非精彩语录,诠释华为大格局
  18. 小波基函数的选择和小波构造
  19. golang-泛型基础篇(一)
  20. 学计算机的大一新生需要买电脑吗,大一新生开学有必要买电脑吗?过来人的建议很中肯,家长们要坚定...

热门文章

  1. 不负春光不负你,2017 LiveBPM新产品抢先看之--考勤管理
  2. CCF HPC China 2022 | 第二届异构计算软件栈与应用论坛成功召开
  3. java必买书记,买书记
  4. css div网页布局代码 自适应,css+div页面布局之1 -- 自适应
  5. iframe窗口添加关闭按钮
  6. php invoker,SECURITY INVOKER存储过程权限提升漏洞_MySQL
  7. java解析通讯录xml_企业微信通讯录回调 成员回调 (新增成员和编辑成员)xml解析错误...
  8. 朴素的矩阵行列式计算之C++实现
  9. 基于Amos路径分析的模型拟合参数详解
  10. CSDN每日一练技巧