为什么要消除过期的引用变量:
因为JAVA是用垃圾收集机制回收内存的。
当只有在变量未被任何类使用的情况下才会被回收。但是当我们编写程序的时候,往往会无意识的保持对象。
导致垃圾回收机制无法回收,引发内存泄漏。
一、未消除引用变量的例子
用数组创建栈。
public class Stack {
private static final int SIZE = 16;
private static final Test [] STACK = new Test[SIZE];
private static int loc = 0;
public void add(Test data){
STACK[loc] = data;
++loc;
}
public Test pop(){
Test data = STACK[loc];
--loc;
return data;
}
}
问题在pop()方法中,当出栈的时候我们获取的test实例,并返回。但是其实Test的引用还保留在STACK数组中。
保留在STACK数组中的变量称为过期变量。数组会保持这种过期变量。导致垃圾回收机制无法回收。
二、解决办法。
不让数组持有该变量的引用。
所以就是加上
STACK[loc] = null;//让引用清零。
三、常见的内存泄漏问题
将数据放到缓存中。然后缓存的数据不再被使用。导致缓存无法被回收,导致泄漏。
如果缓存的生命周期是根据其键值来的那么就可以使用WeakHashMap。
WeakHashMap:当key被回收的时候,那么它的value也会被回收。