[Java] 垃圾回收 ( Garbage Collection ) 的步骤演示
关于 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 ) 的步骤演示的更多相关文章
- hive impala C++ Java垃圾回收 Garbage Collection GC
hive impala impala 推荐每个节点内存 2^7~2^8GB Impala与Hive的比较 - 文章 - 伯乐在线 http://blog.jobbole.com/43233/ &l ...
- 终结 finalize()和垃圾回收(garbage collection)
1.为什么要有finalize()方法? 假定你的对象(并非使用new)获得了一块"特殊"的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以他不知道该如何释放该对象 ...
- Java垃圾回收(整理)
Java垃圾回收 Garbage Collection:GC: 什么样的对象才是垃圾?怎样判断一个对象引用是不是垃圾? 垃圾回收算法:Mark-Sweep(标记-清除)算法,Copying(复制)算法 ...
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- 细述 Java垃圾回收机制→Types of Java Garbage Collectors
细述 Java垃圾回收机制→Types of Java Garbage Collectors 转自:https://segmentfault.com/a/1190000006214497 本文非原创, ...
- Java垃圾回收机制(GC策略)
Java垃圾回收机制(GC策略) 核心:1,哪些是垃圾?[怎么确定这个是垃圾]:2,如何回收垃圾?[怎么更好收垃圾]. Java语言相对于C++等语言有一个自动垃圾回收机制,只用管使用[实例化对象], ...
- java垃圾回收机制学习总结
最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- [牛感悟系列]JAVA(1)理解JAVA垃圾回收
理解JAVA垃圾回收的好处是什么?满足求知欲是一方面,编写更好的JAVA应用是另外一方面. 如果一个人对垃圾回收过程感兴趣,那表明他在应用程序开发领域有相当程度的经验.如果一个人在思考如何选择正确的垃 ...
随机推荐
- App 启动加载广告页面思路
需求 很多app(如淘宝.美团等)在启动图加载完毕后,还会显示几秒的广告,一般都有个跳过按钮可以跳过这个广告,有的app在点击广告页之后还会进入一个广告页面,点击返回进入首页.今天我们就来开发一个广告 ...
- C#-高血压生活习惯数据模拟
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace test ...
- 使用Android SDK Manager自动下载速度慢解决方法
可以在SDK Manager 的更新界面,勾选下载项并去android-sdk-windows\temp文件家中查找文件名称例如:android-2.3.1_r02-linux.zip在前面加上链接h ...
- Mock和injectMocks的区别
@Mock private ForeCatalogManageServiceImpl foreCatalogManageServiceImpl; 如果是上面的写法,那么 红框方法里面的代码不会执行,这 ...
- 17个提升iOS开发效率的必用工具
时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我们提升编码速度和工作效率的工 ...
- PHP PDO获取结果集
一.介绍PDO获取结果集,不得不介绍一下PDO是如果执行SQL语句,一般情况下分三种, 1.query()方法 query()方法通常用于返回执行查询后的结果集.语法是这样的:PDOStatement ...
- ACE的Socket初步
Tcp通信过程一般为如下步骤: 服务器绑定端口,等待客户端连接. 客户端通过服务器的ip和服务器绑定的端口连接服务器. 服务器和客户端通过网络建立一条数据通路,通过这条数据通路进行数据交互. 常用AP ...
- 使用JDBC连接数据库
JDBC(Java Data Base Connectivity)数据库连接,我们在编写web应用或java应用程序要连接数据库时就要使用JDBC.使用JDBC连接数据库一般步骤有: 1.加载驱动程序 ...
- Tweet button with a callback – How to?
原文: http://jaspreetchahal.org/tweet-button-with-a-callback-how-to/ 两种方式:1. 原生的button <a href=&quo ...
- MYSQL主从不同步延迟原理
1. MySQL数据库主从同步延迟原理. 要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作, 主库对所有DDL和DML产生binlog,binlog是 ...