看了一些JAVA内存泄露的原因,主要是一些内存开辟后一直存在其他对象的引用,但是这些数据又不会再用到,导致系统内存泄露,就是GC无法回收。所谓GC回收就是释放内存,在C++中释放内存是 delete 操作符来释放,C++中为了防止悬垂指针的存在,一般在delete后将指针置为 null。    JAVA中如果一个对象我们已经不需要再用了,比如在程序结束时,将类中的私有或者公有的 成员数据,new出的数组,对象等数值置为null就行,剩下的就由GC自己回收内存了。或者这个类中已经不需要在使用这个对象的数据了,就将这个new出的数据对象置为null就可以,当然这是多处引用了这个对象,如果只有自己使用这个对象那么就不需要闲显式的置为null。如果一个对象 BB 引用对象 AA 的数据,用完却不置为null,那么 AA 的被 BB 引用的数据就和可能无法被系统收回,就造成了内存泄露。    我想问上面的话,对不对,或者有哪些地方是不太妥当的,因为在维护别人的代码,之前用的是C++,现在用的JAVA,在维护的代码中存在内存泄露,正在一个一个去查找并解决,

解决方案 »

  1.   

    差不多就是这个意思了。不过实际上因为很多变量自己是有生命周期的,所以没必要主动去置为 null。
    比如函数中的局部变量,函数运行结束,所有局部变量就都会被回收,因此其所引用的对象也会可以被回收。比较容易出问题的是两种情况:
    1、static变量所引用的对象,以及此对象所引用的所有对象;
    2、各种List、Map之类的,可以自由伸缩大小的,如果不remove,其所引用的元素就会跟List一直保留下去。
      

  2.   

    推荐你看Effective Java一书的第6条:消除过期的对象引用。里面说了:清空对象引用应该是一种例外,而不是一种规范行为,消除过期引用最好的方法是让包含该引用的变量结束其生命周期,如果你是在最紧凑的作用域范围内定义每一个变量,这种情形自然而然地发生。一般而言,只要类是自己管理内存,程序员就应该警惕内存泄漏问题。
      

  3.   


    那ArrayList里应该也一样了? 需要显式调用clear()?
      

  4.   


    举个例子:自己用一个数组来实现栈数据结构,如果将一个数据弹出栈只是简单的将栈顶指针下移,而不置null,那么就导致了内存泄漏。还有另外几种场景会导致内存泄漏:缓存,监听器和回调