点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

If you concentrate on the ONE thing in your life that makes you truly happy... everything else in your life will fall into place.

如果人只关注着真正带给自己快乐的事,那其余一切,就都清晰明了了。

每日掏心

年轻时候,以为坚持是永不动摇;到这个年纪,明白了,坚持就是犹疑着退缩着心猿意马着一步三停着,还在往前走。

来自:开源中国 | 责编:乐乐

链接:oschina.net/translate/java-gc

程序员小乐(ID:study_tech)第 816 次推文   图片来自百度

往日回顾:马化腾动怒!微信数据“被共享”,山寨微信团伙被判一年!

     

   正文   

什么是自动垃圾回收?

自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。

所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。

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

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

Spring中如何使用责任链模式

Java对象不再使用时,为什么要赋值为 null ?

在SpringBoot中使用Spring Session解决分布式会话共享问题

关注订阅号「程序员小乐」,收看更多精彩内容

嘿,你在看吗

图解 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 垃圾回收机制

    点击蓝色"小哈学Java"关注我哟 加个"星标",第一时间获取小哈推送的文章哦! 原文:https://www.oracle.com/webfolder/tec ...

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

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

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

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

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

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

  7. 【Java】Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  8. [JVM]成为JavaGC专家(1)—深入浅出Java垃圾回收机制

    对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信一个 ...

  9. 理解 Java 垃圾回收机制

    理解java垃圾回收机制有什么好处呢?作为一个软件工程师,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java应用程序. 这是我个人的主观观点,但我相信一个 ...

最新文章

  1. php结课答辩要求,毕业论文答辩的基本要求和评分标准
  2. python 多维数组的排序
  3. 树莓派_FTP服务器的搭建
  4. VTK:Utilities之ViewportBorders
  5. PAT-BASIC-1039-到底买不买
  6. GPU Gems1 - 8 衍射的模拟
  7. Facebook 开源的快速文本分类器 FastTex
  8. 电脑卡在正在启动windows界面_让 Linux 启动更快
  9. 分布式面试 - dubbo 的 spi 思想是什么?
  10. mysql和oracle的mybatis操作
  11. 设定pic单片机端口为输入_PIC单片机IO端口的软件/硬件可靠性使用方法讨论
  12. PCA(Principal Component Analysis)原理简单分析
  13. Oracle SQL存储过程结构、异常处理示例
  14. vue页面乱码_项目部署到weblogic后页面乱码问题
  15. 大数据分析的方法有哪些
  16. 信号与系统【奥本海目】第二版笔记
  17. 关于atmel的sam9g45无法连接到sam ba以及手动烧写系统时的问题
  18. 关于树莓派DSI屏幕触摸不准的问题
  19. AI经典书单:入门人工智能该读哪些书?
  20. Linux 查看文件

热门文章

  1. Java学习之旅(三四):包装类之 Double
  2. 汽车倒车雷达系统的设计与实现(一)
  3. 面渣逆袭:Spring三十五问,四万字+五十图详解
  4. html5关于校庆作品名称,十周年校庆幼少儿组绘画作品展
  5. H3C华三模拟器HCL安装与下载(HCL_v2.1.2版本)
  6. mysql导入微信小程序云开发_微信小程序-云开发数据库上传json文件
  7. 吴恩达深度神经网络笔记—人脸识别
  8. iOS15.2 注册相册变化通知未给相册权限导致崩溃 [PHPhotoLibrary.sharedPhotoLibrary registerChangeObserver:self]
  9. 证明:旋转矩阵是正交矩阵
  10. 单片机的基本构成及工作原理