解读JVM对象生命周期之创建阶段

开发 后端
你对JVM对象生命周期的概念是否了解,JVM对象生命周期大致可以分为七个阶段,这里向大家描述一下第一个阶段也就是创建阶段,相信你一定会感兴趣的。

本文向大家介绍一下JVM对象生命周期的概念,在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free),这里简单说一下创建阶段。

详细解读JVM对象生命周期

JVM运行空间中,整个JVM对象生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。上面的这7个阶段,构成了JVM中对象的完整的生命周期。下面分别介绍对象在处于这7个阶段时的不同情形。

创建阶段

在对象创建阶段,系统要通过下面的步骤,完成对象的创建过程:

(1)为对象分配存储空间。

(2)开始构造对象。

(3)递归调用其超类的构造方法。

(4)进行对象实例初始化与变量初始化。

(5)执行构造方法体。

上面的5个步骤中的第3步就是指递归地调用该类所扩展的所有父类的构造方法,一个Java类(除Object类外)至少有一个父类(Object),这个规则既是强制的,也是隐式的。你可能已经注意到在创建一个Java类的时候,并没有显式地声明扩展(extends)一个Object父类。实际上,在Java程序设计中,任何一个Java类都直接或间接的是Object类的子类。例如下面的代码: 

  1. publicclassA{  
  2. …  
  3. }  
  4. 这个声明等同于下面的声明:  
  5. publicclassAextendsjava.lang.Object{  
  6. …  

上面讲解了对象处于创建阶段时,系统所做的一些处理工作,其中有些过程与应用的性能密切相关,因此在创建对象时,我们应该遵循一些基本的规则,以提高应用的性能。

下面是JVM对象生命周期在创建对象时的几个关键应用规则:

(1)避免在循环体中创建对象,即使该对象占用内存空间不大。

(2)尽量及时使对象符合垃圾回收标准。

(3)不要采用过深的继承层次。

(4)访问本地变量优于访问类中的变量。

关于规则(1)避免在循环体中创建对象,即使该对象占用内存空间不大,需要提示一下,这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码: 

  1. ……  
  2. for(inti=0;i<10000;++i){  
  3. Objectobj=newObject();  
  4. System.out.println("obj="+obj);  
  5. }  
  6. ……  

 上面代码的书写方式相信对你来说不会陌生,也许在以前的应用开发中你也这样做过,尤其是在枚举一个Vector对象中的对象元素的操作中经常会这样书写,但这却违反了上述规则(1),因为这样会浪费较大的内存空间,正确的方法如下所示: 

  1. ……  
  2. Objectobj=null;  
  3. for(inti=0;i<10000;++i){  
  4. obj=newObject();  
  5. System.out.println("obj="+obj);  
  6. }  
  7. ……  

 采用上面的第二种编写方式,仅在内存中保存一份对该对象的引用,而不像上面的***种编写方式中代码会在内存中产生大量的对象应用,浪费大量的内存空间,而且增大了系统做垃圾回收的负荷。因此在循环体中声明创建对象的编写方式应该尽量避免。
另外,不要对一个对象进行多次初始化,这同样会带来较大的内存开销,降低系统性能,如: 

  1. publicclassA{  
  2. privateHashtabletable=newHashtable();  
  3. publicA(){  
  4. //将Hashtable对象table初始化了两次  
  5. table=newHashtable();  
  6. }  
  7. }  

 正确的方式为: 

  1. publicclassB{  
  2. privateHashtabletable=newHashtable();  
  3. publicB(){  
  4. }  

不要小看这个差别,它却使应用软件的性能相差甚远,如图2-5所示。

初始化对象多次所带来的性能差别

看来在程序设计中也应该遵从“勿以恶小而为之”的古训,否则我们开发出来的应用也是低效的应用,有时应用软件中的一个极小的失误,就会大幅度地降低整个系统的性能。因此,我们在日常的应用开发中,应该认真对待每一行代码,采用***化的编写方式,不要忽视细节,不要忽视潜在的问题。本节关于JVM对象生命周期的***个阶段就介绍到这里,请看下节有关其他阶段的介绍。

【编辑推荐】

  1. JVM内存溢出的两大类型及解决方案
  2. Tomcat配置JVM参数巧妙方法
  3. JVM基础:解析JVM分代垃圾回收策略
  4. JVM for Linux JIT诊断技术简介
  5. 巧解IBM JVM for Linux onPOWER性能调优
责任编辑:佚名 来源: javaeye.com
相关推荐

2010-09-27 10:40:47

JVM对象生命周期

2009-03-04 10:18:50

生命周期JVMjava

2013-08-19 17:03:00

.Net生命周期对象

2010-01-15 13:52:44

VB.NET对象生命周

2009-06-17 15:06:50

Hibernate实体

2023-10-07 00:05:07

2011-07-07 14:22:27

Cocoa 对象 生命周期

2023-10-05 06:01:28

2015-07-08 16:28:23

weak生命周期

2022-08-02 08:00:00

机器学习数据框架

2022-04-19 07:20:24

软件开发安全生命周期SSDLC应用安全

2009-07-23 18:55:17

ASP.NET页生命周

2010-07-14 10:48:37

Perl线程

2009-06-11 11:28:35

JSF生命周期

2012-06-20 10:29:16

敏捷开发

2009-06-24 10:47:55

JSF生命周期

2021-07-19 05:52:29

网络生命周期网络框架

2023-03-16 15:29:57

鸿蒙工具

2009-08-10 14:31:46

ASP.NET组件设计ASP.NET控件生命

2019-10-16 10:50:13

Linux内核测试
点赞
收藏

51CTO技术栈公众号