Java 对象的生命周期

原创 2014年08月05日 16:21:24

Java对象的生命周期

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

1.      创建阶段(Created)

2.      应用阶段(In Use)

3.      不可见阶段(Invisible)

4.      不可达阶段(Unreachable)

5.      收集阶段(Collected)

6.      终结阶段(Finalized)

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

 

图1. JavaObject Life Cycle

1.创建阶段(Created)

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

  • l  为对象分配存储空间
  • l  开始构造对象
  • l  从超类到子类对static成员进行初始化
  • l  超类成员变量按顺序初始化,递归调用超类的构造方法
  • l  子类成员变量按顺序初始化,子类构造方法调用

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

 

2.应用阶段(In Use)

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

 

3.不可见阶段(Invisible)

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

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

举例如下图:本地变量count在25行时已经超出了其作用域,则在此时称之为count处于不可视阶段。当然这种情况编译器在编译的过程中会直接报错了。


图2. 不可见阶段示例

4.不可达阶段(Unreachable)

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

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

 

5.收集阶段(Collected)

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

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

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

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

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

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


6.终结阶段

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


7.对象空间重新分配阶段

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

 

Java 对象生命周期和类生命周期

Java 对象生命周期 在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶...
  • huangzhen0914
  • huangzhen0914
  • 2015-04-21 16:57:30
  • 5038

详解java类的生命周期

引言         最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方...
  • zhengzhb
  • zhengzhb
  • 2012-04-27 13:36:49
  • 42477

详谈java类和对象的生命周期

引言         最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内jav...
  • qq_16485855
  • qq_16485855
  • 2016-09-19 14:20:43
  • 1103

Java 对象生命周期

Java 对象生命周期一直对Java对象的实例化、对象、对象的引用、堆 栈存放的内容迷惑不解。看了 Java编程思想,理解似乎又深了一层。对象和对象的引用Java 编程思想中,把对象的引用比喻成了遥控...
  • xuecancan
  • xuecancan
  • 2017-01-11 15:55:19
  • 260

Java对象在JVM中的生命周期(实例)

当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时候回收它所占...
  • docuxu
  • docuxu
  • 2017-12-05 10:39:02
  • 38

java对象的生命周期

要理解java对象的生命周期,我们需要要明白两个问题,  1、java是怎么分配内存的 ,2、java是怎么回收内存的。 喜欢java的人,往往因为它的内存自动管理机制,不喜欢java的人,往...
  • JAVA2010CZP
  • JAVA2010CZP
  • 2013-01-05 22:33:35
  • 2992

Java对象的生命周期与作用域的讨论

导读:   Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除。因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3。其中T1表示对象的创建时间,T2表...
  • xuezini1955
  • xuezini1955
  • 2007-11-05 09:16:00
  • 3037

Java对象生命周期

java中一个对象的完整生命周期涉及java平台的很多技术。在创建一个java对象之前,需要先由虚拟机加载该类,然后对该java类进行链接和初始化。初始化完成之后,才创建出该类的对象实例。java对象...
  • annsheshira23
  • annsheshira23
  • 2015-07-22 20:48:48
  • 258

Java对象的生命周期与垃圾回收以及四种引用

转载请注明出处: Java对象的生命周期 与 垃圾回收 - ITeye博客 - 老Man 创建对象的方式 用new语句创建对象。使用反射,调用java.lang.Class或java.lan...
  • Dread_naught
  • Dread_naught
  • 2014-11-26 21:27:22
  • 1444

对象的生命周期

一.对象的生命周期: 出生——>服务——>死亡 1.出生:对象的创建 2.服务:对象的使用 3.死亡:对象被回收,java的核心机制之一是gc(垃圾回收机制),有一条守护线程一直默默观察这些被...
  • jiangleyuan
  • jiangleyuan
  • 2017-10-19 19:53:04
  • 30
收藏助手
不良信息举报
您举报文章:Java 对象的生命周期
举报原因:
原因补充:

(最多只允许输入30个字)