[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 。效果图如下。详细演示点击这里(英文)

时间: 2024-10-15 15:25:30

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

JAVA垃圾回收Garbage Collection(二、垃圾收集器

垃圾收集器 HotSpot虚拟机的垃圾收集器 Java虚拟机规范中对垃圾收集器如何实现没有任何规定,因此不同版本的虚拟机所提供的垃圾收集器都可能有很大的差别,并且都会提供参数供用户自己应用的特点和要求组合出各个年代使用的收集器.java 1.7之后的Hotspot虚拟机包含的收集器如下: 新生代收集器:Serial ,ParNew,Parallel Scavenge 老年代收集器:CMS,Serial Old,Parallel Old 独立堆收集器:G1 Serial收集器 serial收集器是

java垃圾回收Garbage Collection(一、垃圾收集算法)

垃圾收集算法 标记-清除算法 最基础的算法是标记-清除(Mark-Sweep)算法.分为标记和清除两个阶段:首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象.之所以说是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的.它主要有两个不足之处:一个是效率标记和清除效率都不高:另一个是空间问题标记清除后产生大量的不连续内存碎片,空间碎片过多可能会导致以后程序运行过程中需要分配较大的对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作.标记清除算

垃圾回收(garbage collection)介绍

 垃圾回收用来实现内存的自动管理(automatic management),区别于人工管理(manual management).人工管理内存容易出现的问题: 1)悬垂指针,dangling pointer 2)重复回收,Double free 3)内存泄露,memory leak 历史 垃圾回收的概念及技术由John McCarthy于1959年发明,应用于List语言中.1959年,计算机科学应该还处于探索.萌芽阶段,但这位大神已经发明了垃圾回收,大神就是大神. 策略 目前的垃圾回收策

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

1.为什么要有finalize()方法? 假定你的对象(并非使用new)获得了一块"特殊"的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以他不知道该如何释放该对象的这块"特殊"内存,为了应对这种情况,java 允许在类中定义一个finalize()的方法. protected void finalize(){ } 2.finalize()方法在何时调用? 一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次

java 垃圾回收机制和调优(转)Java Garbage Collection

(转)http://www.cnblogs.com/shudonghe/p/3457990.html 文主要介绍,JVM的组件,自动垃圾收集器是如何工作的,分代垃圾收集器的收集过程,使如何用Visual VM来监视应用的虚拟机,以及JVM中垃圾收集器的种类. 一.JVM架构 1.HotSpot 架构 HotSpot JVM架构支持较强的基本特征和功能,此外还支持高性能和高吞吐率的特性.例如,JVM JIT编译器产生动态优化的代码,亦即,编译器是在Java运行的时候的时候进行优化,并为当然的系统架

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

细述 Java垃圾回收机制→Types of Java Garbage Collectors 转自:https://segmentfault.com/a/1190000006214497 本文非原创,翻译自Types of Java Garbage Collectors在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的是Java程序员不需要手动写垃圾回收相关的代码.这是使得Java如此流行,同时也是Java能帮助程序员写出更好的Java应用的优点之一. 本文将

详解java垃圾回收机制(转)及finalize方法(转)

详细介绍Java垃圾回收机制 垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变.垃圾收集的目的在于清除不再使用的对象.GC通过确定对象是否被活动对象引用来确定是否收集该对象.GC首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 引用计数收集器 引用计数是垃圾收集器中的早期策略.在这种方法中,堆中每个对象(不是

Java深度历险(四)——Java垃圾回收机制与引用类型

Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题.一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果.开发人员有可能忘记显式的调用释放内存

【Java】Java垃圾回收机制

Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象