Java对象在JVM中的一生

闲扯几句

话说人类世界有个规律,人活不过200岁,当然200岁的怪物说不定有,也许你和我没有听过而已。众所众知,在JVM中我们经常new 出来的一堆对象,它们也是有生命周期的,他们也有自己的年龄,随着程序的运行阶段,他们也会经历生死的轮回。那对象在JVM中具体经历了怎么样的对象人生呢?下面让我们扒一扒。

详情概要

在Java中,对象的生命周期包括以下几个阶段:

1、创建阶段(Created)

2、应用阶段(In Use)

3、不可见阶段(Invisible)

4、不可达阶段(Unreachable)

5、收集阶段(Collected)

6、终结阶段(Finalized)

7、对象空间重分配阶段(De-allocated)

创建阶段(Created)

在创建阶段系统通过下面的几个步骤来完成对象的创建过程

为对象分配存储空间

开始构造对象

从超类到子类对static成员进行初始化

超类成员变量按顺序初始化,递归调用超类的构造方法

子类成员变量按顺序初始化,子类构造方法调用

一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段

应用阶段(In Use)

对象至少被一个强引用持有着。

不可见阶段(Invisible)

当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。

简单说就是程序的执行已经超出了该对象的作用域了。

不可达阶段(Unreachable)

对象处于不可达阶段是指该对象不再被任何强引用所持有。

与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的任何强引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。

收集阶段(Collected)

当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作。

这里要特别说明一下:不要重载finazlie()方法!原因有两点:

会影响JVM的对象分配与回收速度

在分配该对象时,JVM需要在垃圾回收器上注册该对象,以便在回收时能够执行该重载方法;在该方法的执行时需要消耗CPU时间且在执行完该方法后才会重新执行回收操作,即至少需要垃圾回收器对该对象执行两次GC。

可能造成该对象的再次“复活”

在finalize()方法中,如果有其它的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又重新变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用后续的代码管理。

终结阶段

当对象执行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。

对象空间重新分配阶段

垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段”。


参考链接:https://www.jianshu.com/p/825cca41d962

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,764评论 3 83
  • Java引用的种类 1.对象在内存中的状态 对于JVM的垃圾回收机制来说,是否回收一个对象的标准在于:是否还有引用...
    Jack921阅读 3,897评论 0 3
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,035评论 2 31
  • [TOC] 内存管理 一、托管堆基础 在面向对象中,每个类型代表一种可使用的资源,要使用该资源,必须为代表资源的类...
    _秦同学_阅读 3,901评论 0 3
  • 人生第一次的面试怀揣着的是一颗紧张的心。 整个人感受到的情绪就是忐忑不安的,虽说面试的过程蛮紧张的,但是结果还是很...
    方舟lsy阅读 207评论 0 0