具体解读JVM中的对象生命周期[Java编程]
本文“具体解读JVM中的对象生命周期[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:成立阶段(Creation)、利用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可汇集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free).上面的这7个阶段,构成了 JVM中对象的完好的生命周期.下面辨别介绍对象在处于这7个阶段时的差别情形.
2.2.1 成立阶段
在对象成立阶段,系统要通过下面的步骤,完成对象的成立历程:
(1)为对象分配存储空间.
(2)开始构造对象.
(3)递归调用其超类的构造办法.
(4)举行对象实例初始化与变量初始化.
(5)履行构造办法体.
上面的5个步骤中的第3步就是指递归地调用该类所扩大的全部父类的构造办法,一个Java类(除Object类外)至少有一个父类(Object),这个法则既是强迫的,也是隐式的.你大概已经注意到在成立一个Java类的时刻,并没有显式地声明扩大(extends)一个Object父类.实际上,在 Java程序计划中,任何一个Java类都直接或间接的是Object类的子类.比方下面的代码:
public class A { … } 这个声明平等于下面的声明: public class A extends java.lang.Object { … } |
上面讲授了对象处于成立阶段时,系统所做的一些处理工作,此中有些历程与利用的性能密切相关,因此在成立对象时,我们应当遵守一些基本的法则,以提高利用的性能.
下面是在成立对象时的几个关键利用法则:
(1)避免在循环体中成立对象,即便该对象占用内存空间不大.
(2)尽大概及时使对象符合垃圾回收尺度.
(3)不要采取过深的担当层次.
(4)拜候本地变量优于拜候类中的变量.
关于法则(1)避免在循环体中成立对象,即便该对象占用内存空间不大,需求提醒一下,这种情形在我们的实际利用中常常碰到,并且我们很简单犯近似的错误,比方下面的代码:
… … for (int i = 0; i < 10000; ++i) { Object obj = new Object(); System.out.println("obj= "+ obj); } … … |
上面代码的书写方法相信对你来说不会陌生,大概在从前的利用开辟中你也这样做过,特别是在列举一个Vector对象中的对象元素的操作中常常会这样书写,但这却违反了上述法则(1),因为这样会浪费较大的内存空间,精确的办法以下所示:
… … Object obj = null; for (int i = 0; i < 10000; ++i) { obj = new Object(); System.out.println("obj= "+ obj); } … … |
采取上面的第二种编写方法,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方法中代码会在内存中产生大量的对象利用,浪费大量的内存空间,并且增大了系统做垃圾回收的负荷.因此在循环体中声明成立对象的编写方法应当尽大概避免.
别的,不要对一个对象举行多次初始化,这一样会带来较大的内存开销,降低系统性能,如:
public class A { private Hashtable table = new Hashtable (); public A() { // 将Hashtable对象table初始化了两次 table = new Hashtable(); } } |
精确的方法为:
public class B { private Hashtable table = new Hashtable (); public B() { } } |
不要藐视这个差别,它却使利用软件的性能相差甚远,如图2-5所示.
图2-5 初始化对象多次所带来的性能差别
看来在程序计划中也应当顺从“勿以恶小而为之”的古训,不然我们开辟出来的利用也是低效的利用,有时利用软件中的一个极小的失误,就会大幅度地降低整个系统的性能.因此,我们在平常的利用开辟中,应当认真对待每一行代码,采取最优化的编写方法,不要轻忽细节,不要轻忽潜在的问题.
以上是“具体解读JVM中的对象生命周期[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |