对象的生命周期

1.对象周期的七个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。

2.创建阶段:

1)为对象分配内存空间

2)开始构造对象

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

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

5)执行构造方法体

第 3)步就是指递归地调用该类所扩展的所有父类的构造方法,一个Java类(除Object类外)至少有一个父类(Object),这个规则既是强制的,也是隐式的。

3.创建对象遵守的规则:

创建对象时,我们应该遵循一些基本的规则,以提高应用的性能。

下面是在创建对象时的几个关键应用规则:

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

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

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

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

如下图:错误的创建对象

for(int i=0; i<=100; i++){

Object obj = new Object();

System.out.println("obj="+obj);

}

如下图:正确的创建对象

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() {

}

}

4.应用阶段:系统至少维护着对象的一个强引用(Strong Reference);所有对该对象的引用全部是强引用(除非我们显式地使用了:软引用(Soft Reference)、弱引用(Weak Reference)或虚引用(Phantom Reference))。

1)强引用(Strong Reference):指JVM内存管理器从根引用集合(Root Set)出发遍寻堆中所有到达对象的路径。当到达某对象的任意路径都不含有引用对象时,对这个对象的引用就被称为强引用。

2)软引用(Soft Reference):只有当内存不够的时候,才回收这类内存,因此在内存足够的时候,它们通常不被回收。可以防止系统内存溢出,避免系统崩溃(crash)。因此在处理一些占用内存较大而且声明周期较长,但使用并不频繁的对象时应尽量应用该技术。

5.不可视阶段:一个对象经历了应用阶段之后,那么该对象便处于不可视阶段,说明我们在其他区域的代码中已经不可以再引用它,其强引用已经消失。通俗点说就是变量不能超范围使用。

public void process () {

try {

Object obj = new Object();

obj.doSomething();

} catch (Exception e) {

e.printStackTrace();

}

while (isLoop) { // ... loops forever

// 这个区域对于obj对象来说已经是不可视的了

// 因此下面的代码在编译时会引发错误

obj.doSomething();

}

}

6.不可到达阶段:处于不可到达阶段的对象,在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用,这些对象通常是指所有线程栈中的临时变量,所有已装载的类的静态变量或者对本地代码接口(JNI)的引用。这些对象都是要被垃圾回收器回收的预备对象,但此时该对象并不能被垃圾回收器直接回收。其实所有垃圾回收算法所面临的问题是相同的——找出由分配器分配的,但是用户程序不可到达的内存块。

7.可收集阶段、终结阶段与释放阶段:

1)垃圾回收器发现该对象已经不可到达。

2)finalize方法已经被执行。

3)对象空间已被重用。

当对象处于上面的三种情况时,该对象就处于可收集阶段、终结阶段与释放阶段了。虚拟机就可以直接将该对象回收了。

8.类的生命周期和对象的生命周期:对象基本上都是在JVM的堆区中创建,在创建对象之前,会触发类加载(加载、连接、初始化),当类初始化完成后,根据类信息在堆区中实例化类对象,初始化非静态变量、非静态代码以及默认构造方法,当对象使用完之后会在合适的时候被JVM垃圾收集器回收。对象的生命周期只是类的生命周期中使用阶段的主动引用的一种情况(即实例化类对象)。而类的整个生命周期则要比对象的生命周期长的多。

友情链接:
Copyright © 2022 86年世界杯_世界杯预选赛阿根廷 - fjyfzz.com All Rights Reserved.