JVM运行空间中,对象的整个生命周期大致分为7个阶段:
1.创建阶段
1.1 对象的创建过程:
1)对象分配内存存储空间
2)开始构造对象
3)递归调用其超类的构造方法
4)进行对象实例初始化与变量初始化
5)执行构造方法体
1.2 创建对象时的几个关键应用规则
1)避免在循环体中创建对象,即使该对象占用内存空间不大。
2)尽量及时使对象符合垃圾回收标准
3)不要采用深的继承层次
4)访问本地变量优于访问类中的变量
5)不要对一个对象初始化多次这样会带来较大的内存开销,降低系统性能
2.应用阶段
对象的应用阶段,对象具备下列特征:
1)系统至少维护着对象的一个强引用
2)所有对该类对象的引用全部是强引用(除非我们显示地使用了:软引用、弱引用或虚引用)
强引用(Strong Reference) 是指JVM内存管理器从根引用集合(Root Set) 出发遍寻堆中所有到达对象的路径.当达到某对象的任意路径都不含有引用对象时,对这个对象的引用就被称为强引用.
软引用(Soft Reference)的主要特点是具有较强的引用功能.只有当内存不够的时候,才回收这类内存,因此内存足够的时候这类内存通常不回收.
弱引用(Weak Reference)对象与Soft引用对象的最大不同就在于:GC在进行回收时,需要通过算法检查是否回收Soft引用对象,而对于Weak引用对象,GC总是进行回收.
虚引用(Phantom Reference)的用途较少,主要用于辅助finalize函数的使用.Phantom对象指一些执行完了finalize函数,并为不可达对象,但是还没有被GC回收的对象.这种对象可以辅助finalize进行后期的回收工作,我们通过覆盖Reference 的 clear() 方法,增强资源回收机制的灵活性.
3. 不可视阶段
当一个对象处于不可视阶段,说明我们在其他区域的代码中已经不可以引用他,其强引用已经消失.
4. 不可达阶段
处于不可达阶段的对象在虚拟机的对象引用跟集合中再也找不到直接或间接的强引用,这些对象一般是所有线程的栈中的临时变量,所有已装载的类的静态变量或者是对本地代码(JNI)的引用.
5. 可收集阶段, 终结阶段,释放阶段
当对象处于这三个阶段时该对象可能处于下面三种情况:
1)回收器发现该对象已经不可达
2)finalize方法已经被执行
3)对象空间已经被重用
网友评论