精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>JAVA编程>>杂项>>关于Java的对象释放及内存渗漏的一点心得

主题:关于Java的对象释放及内存渗漏的一点心得
发信人: liuguanghui()
整理人: zjxyz(2002-01-21 08:15:41), 站内信件
关于Java的对象释放及内存渗漏的一点心得


众所周知,Java的对象处理机制与Delphi及C++不同。Java的对象在创建之后,如果不再使用的话,将会由JVM自动回收(即所谓的垃圾回收机制),而在Delphi及C++中没有这种机制。Delphi及C++中创建的对象要求程序员进行显式的回收。

那么这是否说明,Java语言中对于对象的释放根本就不必考虑了呢?否。请看以下的例子。

在如下的堆栈Stack的数据结构中,内部有一个数组成员存贮器storage用于存放入栈对象(的指针)。出栈成员方法为pop(),如下所示。其它入成员方法略。
//Code segment 1 of Class Stack   Error
class Stack{
  Object[] storage;
  :    
  public Object pop()
  {
    return storage[index--]; //Maybe cause Memory Leak!
  }
  :
}

在此方法中,将会产生内存渗漏可能!为便于描述,假设当前指针为index,存贮器storage当前位置中的引用对象为Obj,则在执行pop()成员方法时,将返回存贮器storage中当前指针index位置中的对象Obj,然后指针上移(即index--)。注意,此时即使获取返回对象的变量自己释放后,也别指望Obj会真正释放,因为存贮器storage中原指针处中还保存着对返回对象Obj的引用。当然,如果你再执行push()成员覆盖存贮器storage中原指针处中对象引用后,原Obj对象将可以JVM进行回收,但这可能会是一个很长的时间。

为了解决这个问题,代码改写成如下的格式,即可避免以上描述的问题。 
//Code segment 2  of  Class Stack  Right
class Stack{
  :
  public Object pop()
  {
    Object returnValue = storage[index];
    storage[index--] = null; // Explicitly assign null !
    return returnValue;    
  }
  :
}

我们曾在一个研发项目中先使用Java进行开发,后来再用Delphi重写此项目时,就遇到了由于在Java中忽略对象释放而导致的移植困难。

对此,有如下的心得:
1.Java的垃圾回收机制确实可以释放程序员的工作量。
2.在Java的实现过程中,其实也是要考虑其对象释放的。最好的方法是在不使用某对象时,显式地将此对象赋空。
3.最好遵循谁创建谁释放的原则。

(注:本文的代码示例来自于Sybex Java 2 Cert)



----
Knowledge sharing,working together...     
[email protected]

[关闭][返回]