关闭

解读JVM对象生命周期的几个阶段

发表于:2010-10-25 10:14

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
java
#
Java

  在JVM运行空间中,整个JVM对象生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free),这里向大家描述一下除创建阶段之外的其他几个阶段。

  应用阶段

  这里看一个JVM对象生命周期的第二各阶段,当对象的创建阶段结束之后,该对象通常就会进入对象的应用阶段。这个阶段是对象得以表现自身能力的阶段。也就是说对象的应用阶段是对象整个生命周期中证明自身“存在价值”的时期。在对象的应用阶段,对象具备下列特征:

  ◆系统至少维护着对象的一个强引用(StrongReference);

  ◆所有对该对象的引用全部是强引用(除非我们显式地使用了:软引用(SoftReference)、弱引用(WeakReference)或虚引用(PhantomReference))。

  上面提到了几种不同的引用类型。可能一些读者对这几种引用的概念还不是很清楚,下面分别对之加以介绍。在讲解这几种不同类型的引用之前,我们必须先了解一下Java中对象引用的结构层次。

  Java对象生命周期引用的结构层次示意如图2-6所示。

  由图2-6我们不难看出,上面所提到的几种JVM对象生命周期引用的层次关系,其中强引用处于顶端,而虚引用则处于底端。下面分别予以介绍。

  1.强引用

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

  2.软引用

  软引用(SoftReference)的主要特点是具有较强的引用功能。只有当内存不够的时候,才回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引用对象还能保证在Java抛出OutOfMemory异常之前,被设置为null。它可以用于实现一些常用资源的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory。再者,软可到达对象的所有软引用都要保证在虚拟机抛出OutOfMemoryError之前已经被清除。否则,清除软引用的时间或者清除不同对象的一组此类引用的顺序将不受任何约束。然而,虚拟机实现不鼓励清除最近访问或使用过的软引用。下面是软引用的实现代码:

  • ……  
  • importjava.lang.ref.SoftReference;  
  • …  
  • Aa=newA();  
  • …  
  • //使用a  
  • …  
  • //使用完了a,将它设置为soft引用类型,并且释放强引用;  
  • SoftReferencesr=newSoftReference(a);  
  • a=null;  
  • …  
  • //下次使用时  
  • if(sr!=null){  
  • a=sr.get();  
  • }  
  • else{  
  • //GC由于内存资源不足,可能系统已回收了a的软引用,  
  • //因此需要重新装载。  
  • a=newA();  
  • sr=newSoftReference(a);  
  • }  
  • ……  
  •   软引用技术的引进,使Java应用可以更好地管理内存,稳定系统,防止系统内存溢出,避免系统崩溃(crash)。因此在处理一些占用内存较大而且声明周期较长,但使用并不频繁的对象时应尽量应用该技术。正像上面的代码一样,我们可以在对象被回收之后重新创建(这里是指那些没有保留运行过程中状态的对象),提高应用对内存的使用效率,提高系统稳定性。

      但事物总是带有两面性的,有利亦有弊。在某些时候对软引用的使用会降低应用的运行效率与性能,例如:应用软引用的对象的初始化过程较为耗时,或者对象的状态在程序的运行过程中发生了变化,都会给重新创建对象与初始化对象带来不同程度的麻烦,有些时候我们要权衡利弊择时应用。

    31/3123>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号