[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应用是另外一方面. 如果一个人对垃圾回收过程感兴趣,那表明他在应用程序开发领域有相当程度的经验.如果一个人在思考如何选择正确的垃 ...
随机推荐
- iPad横竖屏代码适配
你可能非常了解用不同的方式去适配不同尺寸的iPhone屏幕,在适配iPhone屏幕时你需要考虑的只是屏幕大小变化带来的UI元素间隔的变化,但是在iPad上主要针对的是横竖屏下完全不同的UI元素的布局, ...
- Codeforces 526D - Om Nom and Necklace 【KMP】
ZeptoLab Code Rush 2015 D. Om Nom and Necklace [题意] 给出一个字符串s,判断其各个前缀是否是 ABABA…ABA的形式(A和B都可以为空,且A有Q+1 ...
- jsp中的c标签
核心标签库 引用: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> ...
- 命令行命令mvn
在cmd命令行敲击mvn clean install 默认读取的maven配置文件是D:\software\apache-maven-3.2.1\conf\settings.xml 这个文件里面配置有 ...
- Design Pattern —— Singleton
Design Pattern —— Singleton 强力推荐枚举和类级内部类方式实现单例模式 单例模式是开发中非常常用的一种模式,简单的说,我们希望一个类永远都只有一个对象. 主要有两个用途: ...
- mssql的holdlock锁跟索引的关系
表锁tablock是会给表所有数据附加共享锁,但是只是当前语句有效,语句执行完毕,锁释放,而不会持续到事务结束,而tablockX表锁是持续到事务结束的锁 holdlock锁,锁定的范围会根据wher ...
- JavaScript--对象+函数
1. 复杂数据类型 Object ECMAScript中的对象其实就是一组数据(属性)和功能(方法)的集合. 1) 创建Object实例: 1.使用构造函数创建,new Object() ...
- 安卓开发入门之activity
安卓开发主要用到的是java语言,对于一个activity,自己写的程序可以继承至Activity,该Activity先会运行一个叫 onCreat()的类,可以在其中申明一些初始化的函数等,这个函数 ...
- java_reflect_04
反射操作数组: 通过public Class<?> getComponentType()来取得一个数组的Class对象 例: import java.lang.reflect.Array ...
- c/c++内存机制(一)(转)
转自:http://www.cnblogs.com/ComputerG/archive/2012/02/01/2334898.html 一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: ...