如果一个没用的引用,到另一个无用对象的引用一直没有被删除,java中是会出现内存泄露的情况。
比如一个方法已经执行了很长时间,或者是死循环,那么这个方法的局部变量保留的对象引用就可能比对他们的实际需要要长的多。
比如:
public static void main(String[] args) {
int[] array = new int[10000];
int x = doSomething1(array); //某个方法对数组进行引用
/*
* 上面的语句执行完之后,我们不再需要数组array了
* 正常情况下,该数组占用的内存应该被回收,可是,
* 这个array又是一个局部变量,所以该方法(doSomething1())没有返回前,
* 它一直指向这个数组,我们可以发现这个方法不会返回,
* 因为它在一个死循环里被调用,所以我们只能是显示的撤销这个引用,array = null;
* 只有这样,垃圾收集器才能知道它可以回收这个array数组
* */
array = null;
for(;;){
doSomething2(x); //某个方法对x引用
}
}
当用散列表或者类似的数据结构在对象之间相互关联时,也可能发生内存泄露,即使当不再需要所有这些对象时,这些对象之间的关联在
散列表中仍然是存在的,这样就只有当散列表本身被回收时,这些对象才能被回收,如果散列表的生命周期比它所包含的对象的生命周期长,
那么就一定会导致内存泄露