日期:2014-05-19  浏览次数:20672 次

关于static声明的变量的占据的内存问题
工具类:
public class CommonUtil{
  public static List<MyEntity> myList1;
  public static List<Object> mylist2;
  public static List<Integer> mylist2;

}

使用类:

public class Test{
  public static void main(...){
  CommonUtil.myList1 = new ArrayList<MyEntity>();
  CommonUtil,myList1.add(new MyEntity());
}
//....

  //执行清理缓存操作
  public cleanData(){
  CommonUtil,myList1 = null;
}

}

由于在多个类中需要使用到 List<MyEntity> myList1 的结果集,所以把它缓存到静态的空间里 ,当我不再需要这个结果集的时候,在cleanData()中清理掉那些对象手动置null。

我对jvm不太了解 ,我只知道static有区分与栈空间和堆空间的独立存储空间,我手动置null是否可以提醒jvm回收垃圾对象?对于处理可变的静态变量内存回收方法,还有哪些?

------解决方案--------------------
jvm回收垃圾对象 是通过判断该对象是否还存在有给引用的情况,如果你的static对象没有给其他未释放的对象引用到,那设置为null之后,jvm在GC时应该是会回收的
------解决方案--------------------
“例如 我再设置一个 List<MyEntity> list = CommonUtil.myList1; 而在list未被释放的前提下 即使CommonUtil.myList1已经手动置null,jvm也不会回收这部分内存?”
是的,不会回收,因为还有变量(List<MyEntity> list)引用那块内存。
如果楼主担心不被回收,可以在每次引用某个对象,操作完成后都手动释放引用。
即将list = null;这样就没有变量引用那块内存了,jvm便会回收
楼主如果顾忌这样的多个变量引用同一个对象的问题,就尽量不要把ComonUtil.myList1等变量赋值给其他变量就好了,如果非要赋值,记得将被赋值变量( List<MyEntity> list)置null就可以了
不知楼主是不是这个意思