工具类:
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回收垃圾对象?对于处理可变的静态变量内存回收方法,还有哪些?

解决方案 »

  1.   

    jvm回收垃圾对象 是通过判断该对象是否还存在有给引用的情况,如果你的static对象没有给其他未释放的对象引用到,那设置为null之后,jvm在GC时应该是会回收的
      

  2.   

    静态变量在类加载时初始化,在JVM停止时才释放,因此不会被回收!!!
      

  3.   

      “如果你的static对象没有给其他未释放的对象引用到” 这句话是什么意思呢?
    例如 我再设置一个 List<MyEntity> list = CommonUtil.myList1; 而在list未被释放的前提下 即使CommonUtil.myList1已经手动置null,jvm也不会回收这部分内存?而实际中 CommonUtil.myList1作为一个结果集,他会在很多出代码中用到。那究竟如何才能有效避免这个问题
      

  4.   

    jvm回收垃圾是不是及时的,是回收那些它认为是垃圾的不需要空间。
      

  5.   

    嗯 我现在的问题就是 我想知道jvm是否在我手动置null之后把该变量视作垃圾 ?如果不是,那我置null就没有任何意义好让我换一种清理缓存的方法
      

  6.   

    你开了一个大内存,当没有被任何对象使用的时候会被JVM清除掉。
    如果手动设置null,JVM也能检测到,具体请不清空就不知道了
      

  7.   

    1)"嗯 我现在的问题就是 我想知道jvm是否在我手动置null之后把该变量视作垃圾 ?"
    楼主说的是单纯的List<MyEntity> myList1变量,还是变量所引用的对象?
      a)如果是myList1静态变量的话,它会被分配到方法区(存储描述类的相关信息的区域,如Class对象,该区域很少被GC(类的卸载),因为GC的要求条件很苛刻),除非它所在的类被卸载才会被回收(这个不难理解吧,类的静态变量,所有实例共享),否则一直存在于内存中(方法区),而类被卸载的条件必须同时满足----内存中没有该类的实例(对象),不再引用Class对象等(还有一个忘了)。所以跟你手动设置null没有关系,手动设置null只是不让他引用其他对象(其实也是赋值,只是特殊的值null),跟它自己没半毛钱关系。
      b)如果是该变量引用的对象的话,一旦不被任何变量引用(没有指针指向他),当垃圾回收发生时便会被回收(通常情况都会),至于什么时候发生GC,我们无法控制,但通常是在内存无法为下一个对象分配足够的连续内存时触发。
    好吧就说这些,楼主还有什么问题可以再交流
      

  8.   

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

  9.   


    哦 明白了 的确是的 要避免为static对象添加重复的引用 只要那块内存地址没有东西指向 jvm就会在适当时候回收