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 对象的生命周期相关推荐

  1. Java对象的生命周期与作用域的讨论(转)

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

  2. java对象的生命周期及回收

    在网上看到一篇不错的文章,记录下来备忘. 要理解java对象的生命周期,我们需要要明白两个问题, 1.java是怎么分配内存的 ,2.java是怎么回收内存的. 喜欢java的人,往往因为它的内存自动 ...

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

    转载请注明出处: Java对象的生命周期 与 垃圾回收 - ITeye博客 - 老Man 创建对象的方式 用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.re ...

  4. 谈谈Java对象的生命周期

    经过前面的分析 ,我们现在来看一下创建的对象到底是什么东西,并且完整的总结一下一个对象从创建到回收到底经过了哪些阶段. 1 对象的创建 对象创建的主要流程:  1.类加载检查 虚拟机遇到一条new指令 ...

  5. java 对象 jvm生命_JVM对象的生命周期

    一旦一个类被装载.连接和初始化,它就随时可以被使用.程序可以访问它的静态字段,调用它的静态方法,或者创建它的实例.作为Java程序员有必要了解Java对象的生命周期. 类实例化 在Java程序中,类可 ...

  6. 面试:对象的生命周期

    面试:对象的生命周期 一旦一个类被装载.连接和初始化,它就随时可以被使用.程序可以访问它的静态字段,调用它的静态方法,或者创建它的实例.作为Java程序员有必要了解Java对象的生命周期. 类实例化 ...

  7. python对象的生命周期_python对象的生命周期

    引言 碰到以下问题: 代码1: from Tkinter import * root = Tk() photo = PhotoImage(file=r'E:\workspace\python\111. ...

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

    引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...

  9. java中的的一些生命周期,Java中对象的生命周期

    Java中对象的生命周期 (1) 对象生命周期的开始 对象生命周期开始时,需要为对象分配内存,并且初始化它的实例变量: 对象生命周期结束 Java虚拟机的垃圾回收线程回收对象的内存. (2) 创建一个 ...

最新文章

  1. Oracle RBA(Redo Byte Address) 说明
  2. Emacs常用快捷键
  3. SVN Working Copy xxx locked
  4. python安装requests
  5. SAP 电商云 Spartacus UI SSR 里 engine 和 engine instance 的区别
  6. 麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式
  7. 关于团队项目的一些感想——刘宇翔
  8. leecode-3无重复字符串的最长子字符串C版-滑动窗口
  9. MIT研发“读心机”:不开口也能对话,人生开挂全靠它
  10. vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
  11. Android NDK学习(1) 简介
  12. 2018年湘潭大学程序设计竞赛 - 题解
  13. 如何查看自己win10的产品密钥
  14. 游戏后端自增id选型
  15. 数据分析师需要学习什么课程?
  16. 【黑帽大牛】浅谈SEO快排系统对网站排名优化真的有帮助吗?【精品】
  17. 网络视频血战:弱者渔利
  18. 医美行业舆情工作重点分析
  19. “新恒大”的几个“万亿未来”
  20. QQ邮箱更新 - 优化标签、短消息、会话等

热门文章

  1. XPath与多线程爬虫
  2. Java面试题之多线程同步和互斥有几种实现方法,都是什么?
  3. mybatis简化实现思路
  4. git常用命令及规范流程
  5. 13.angular时间
  6. Abaqus用户子程序umat的学习
  7. Linux音频设备驱动
  8. 报表性能优化方案之报表服务器优化基础讲解
  9. pku The Windy's KM最小权匹配 or 最小费用最大流
  10. 从空间数据库中删除所有拓扑对象