在JVM运行空间中,对象的整个生命周期大致可以分为七个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段( Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)、释放阶段(Free)。经过上述的七个阶段,构成了JVM中对象的完整的生命周期。下面分别介绍对象在处于这七个阶段的不同情形。
创建阶段
对象在创建阶段,系统要经过一下的步骤,完成对象的创建过程:
(1)、为对象分配存储空间
(2)、开始构建对象
(3)、递归调用其父类的构造器
(4)、惊醒对象实例初始化与变量初始化
(5)、执行构造方法体
上面五个步骤中的第三步就是递归的调用该类所扩展的所有父类的构造方法,一个java类(除Object类外)至少有一个父类,这个规则即是强制的,又是隐私的,你可能已经注意到,在创建一个java类的时候,并没有显式的扩展一个Object父类,实际上,在java程序设计中,任何一个java类都直接或者间接的是Object的子类。
上面介绍了对象处于创建阶段的时候,系统所做的一些处理工作,其中有些性能和应用的性能密切相关,因此在创建对象是我们应该遵循一些规则,以提高应用的性能。
下面试在创建对象时候的几个关键的应用规则:
(1)、避免在循环体中创建对象,即使该对象占用的内存空间不大。
(2)、尽量及时使对象符合垃圾回收标准。
(3)、不要采用太深的继承体制。
(4)、访问本地变量优于访问类中的变量。
看来在程序设计中也应该遵从“勿以恶小而为之”的古训,否则我们开发出来的应用也是低效的应用,有时应用软件中的一个极小的失误,就会大幅度地降低整个系统的性能。因此,我们在日常的应用开发中,应该认真对待每一行代码,采用最优化的编写方式,不要忽视细节,不要忽视潜在的问题

JVM中的对象生命周期的更多相关文章

  1. c#中的对象生命周期

    无论是指类型的变量或是类类型的变量,其存储单元都是在栈中分配的,唯一不同的是类类型的变量实际上存储的是该类对象的指针,相当于vc6中的CType*,只是在.net平台的语言中将指针的概念屏蔽掉了.我们 ...

  2. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  3. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  4. .Net组件程序设计之对象生命周期

    .Net组件程序设计之对象生命周期 .NET 垃圾回收 IDisposable() Using语句 .NET 垃圾回收 是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是 ...

  5. Ninject之旅之三:Ninject对象生命周期

    摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...

  6. iOS视图控制对象生命周期

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  7. (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  8. IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  9. JAVA面试题:Spring中bean的生命周期

    Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一 ...

随机推荐

  1. common常用到的类

    org.apache.commons.codec.digest.DigestUtils.md5Hex(String)    md5

  2. Fibonacci number

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  3. 2018.09.28 bzoj3743: [Coci2015]Kamp(树形dp)

    传送门 这是一道很有意思的题. 我们把所有的关键点都提出来,当成一棵有边权的虚树. 然后发现虚树上除最后不回到虚根的那条路径外外每条边都会被走两遍. 显然要让答案最优,不走的路径应该在虚树的直径上,于 ...

  4. Python网络编程总结

    ----learn from luffycity---- 1. 什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件),C/S架构就是基于网络实现客户端与服务端通信 ...

  5. Linux 随记

    通配符和文件名变量:* ? [] * 查询 $ ls doc1 doc2 document mydoc monday $ ls doc* doc1 doc2 document $ ls  *day m ...

  6. 记录一次shell里局部变量的问题

    一:起因是这样的,自己今天面试被问到怎么读取某文件夹下所有的文件的每一行的数值的总和:其中文件中数值在每一行里的格式为num|,如33|,因此我第一想到的是通过cut -d\| f1 file来获取每 ...

  7. Java 窗体居中 通用代码

    Toolkit kit = Toolkit.getDefaultToolkit();    // 定义工具包    Dimension screenSize = kit.getScreenSize() ...

  8. webuploader 上传传自定义参数

    全局设置 // 初始化的时候直接添加 var uploader = new WebUploader.Uploader({     ...     formData: {         uid: 12 ...

  9. 顺序表[A+B->C]

    /*----代码段@映雪------*/ /*采用顺序表存储,改成数组也行*/ int MergeList(SeqList &A,SeqList &B,SeqList &C) ...

  10. yum 常用命令

    yum是一个用于管理rpm包的后台程序,用python写成,可以非常方便的解决rpm的依赖关系.在建立好yum服务器后,yum客户端可以通过 http.ftp方式获得软件包,并使用方便的命令直接管理. ...