关于 JVM 垃圾回收机制的基础内容,可参考上一篇博客 垃圾回收机制 ( Garbage Collection ) 简介

上一篇博客,介绍了堆的内存被分为三个部分:年轻代、老年代、永生代。这篇博文将演示这三个部分如何交互,实际也演示了垃圾回收。

1. 首先,所有新创建的对象都会陪分配到年轻代的 Eden 空间,而两个 survior 空间一开始都为空。

下图表示的是运行一段实际后的年轻代内存情况,新创建的对象会被放在 Eden 空间,"from" survior space 里面的数字表示当前内存块经历的垃圾回收次数。没经历一次垃圾回收,内存块的数字就加一,所有数字越大,说明存在的时间越久。

2. 当 Eden 空间被填满,就会触发次垃圾回收。

3. 触发次回收,需要清理 Eden 空间的全部对象,没有被用的对象会比清除,幸存下来的对象全部被移到 s0 幸存空间,并标记经历的回收次数为 1 。若 s0 幸存空间无法装下所有从 Eden 迁移过来的幸存对象,多出来的对象会被直接迁移到老年代空间。这里忽略了上图 3, 1 内存块。

4. 第二次进行次垃圾回收时,Eden 空间发生同样的事情,没有被引用的对象被删除,还被引用的对象被移到幸存区空间。这次移到另一个幸存区空间 s1 。若 s1 的空间不足以装下所有的来自 Eden 的幸存对象,剩余对象直接被移到老年代。

上一次存储幸存空间的 s0 也被进行垃圾回收,幸存下来的对象年龄加1,并被移到 s1 幸存区。同样地,若 s1 无法装下所有移过来的幸存对象,剩余对象被直接移到老年代。清空 s0 空间。

5. 下一次次垃圾回收,处理流程一样,只是幸存区调转,还被引用的对象被移到 s0 空间。幸存下来的对象年龄加1,Eden 和 s1 空间被清空。

根据4、5步可见,无论何时幸存区 s0, s1 中,总有一个是为空的。

6. 这一步演示对象升迁。在某次次垃圾回收后,当一些年长的对象达到某个年纪阀门(本例子是 8 ),它们便从年轻代升迁到老年代。

7. 随着次垃圾回收的进行,不停地升迁对象到老年代空间。

8. 上面,几乎涵盖了年轻代的全部流程步骤。最终,会执行主垃圾回收,清理并压缩老年代空间。

参考资料

The Generational Garbage Collection Process, Java Garbage Collection Basic, Oracle

后序

想观察某个 java 进程在 JVM 中各个世代的内存使用情况,可以使用工具 jvisualvm 。效果图如下。详细演示点击这里(英文)

[Java] 垃圾回收 ( Garbage Collection ) 的步骤演示的更多相关文章

  1. hive impala C++ Java垃圾回收 Garbage Collection GC

    hive impala impala  推荐每个节点内存  2^7~2^8GB Impala与Hive的比较 - 文章 - 伯乐在线 http://blog.jobbole.com/43233/ &l ...

  2. 终结 finalize()和垃圾回收(garbage collection)

    1.为什么要有finalize()方法? 假定你的对象(并非使用new)获得了一块"特殊"的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以他不知道该如何释放该对象 ...

  3. Java垃圾回收(整理)

    Java垃圾回收 Garbage Collection:GC: 什么样的对象才是垃圾?怎样判断一个对象引用是不是垃圾? 垃圾回收算法:Mark-Sweep(标记-清除)算法,Copying(复制)算法 ...

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

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

  5. 细述 Java垃圾回收机制→Types of Java Garbage Collectors

    细述 Java垃圾回收机制→Types of Java Garbage Collectors 转自:https://segmentfault.com/a/1190000006214497 本文非原创, ...

  6. Java垃圾回收机制(GC策略)

    Java垃圾回收机制(GC策略) 核心:1,哪些是垃圾?[怎么确定这个是垃圾]:2,如何回收垃圾?[怎么更好收垃圾]. Java语言相对于C++等语言有一个自动垃圾回收机制,只用管使用[实例化对象], ...

  7. java垃圾回收机制学习总结

    最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...

  8. 【转载】Java垃圾回收机制

    原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...

  9. [牛感悟系列]JAVA(1)理解JAVA垃圾回收

    理解JAVA垃圾回收的好处是什么?满足求知欲是一方面,编写更好的JAVA应用是另外一方面. 如果一个人对垃圾回收过程感兴趣,那表明他在应用程序开发领域有相当程度的经验.如果一个人在思考如何选择正确的垃 ...

随机推荐

  1. codevs1690开关灯

    #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #def ...

  2. DataTable数据与Excel表格的相互转换

    using Excel = Microsoft.Office.Interop.Excel; private static Excel.Application m_xlApp = null; /// & ...

  3. 【转】 UITableView 的indexPath

    原文:http://blog.csdn.net/mengtnt/article/details/6733691 前面说过了viewController的一些基本注意事项.这里针对不同的viewCont ...

  4. [转] 详细整理:UITableView优化技巧

      原文:http://www.cocoachina.com/ios/20150602/11968.html   最近在微博上看到一个很好的开源项目VVeboTableViewDemo,是关于如何优化 ...

  5. [转]Delphi 关键字详解

    全文链接地址:http://www.cnblogs.com/del/archive/2008/06/23/1228562.html

  6. hive 桶相关特性分析

    1. hive 桶相关概念     桶(bucket)是指将表或分区中指定列的值为key进行hash,hash到指定的桶中,这样可以支持高效采样工作.     抽样( sampling )可以在全体数 ...

  7. 学习用CMake来编写Qt程序

    最近开始学习CMake,因为项目需求需要用到Qt,自带的qmake会出现许多问题(比如文件修改之后有时候qmake不会侦测到不会重新编译,需要手动去编译等),于是开始尝试使用CMake来编写Qt程序, ...

  8. inline-block(行内区块元素)的详解和应用

    说inline-block(行内区块元素)之前,先说下他另外的2个兄弟 display:inline; 内联元素,简单来说就是在同一行显示.他没有高度,给内联元素设置width和height是没效果的 ...

  9. ueditor 1.4.3.2 独立/单独 上传图片框原理

    其实简单的说就是编辑框很多按钮,所有按钮的功能都是以command形式提供,所以execCommand就是执行这些功能的命令.有些按钮是能弹出显示一个对话框,他的基类就是dialog,而所有被弹出的d ...

  10. thinkphp的nginx配置

    thinkphp的nginx配置 server { listen 80; server_name www.abc.com; #charset utf-8; access_log /var/www/ww ...