工具类:
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回收垃圾对象?对于处理可变的静态变量内存回收方法,还有哪些?
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回收垃圾对象?对于处理可变的静态变量内存回收方法,还有哪些?
例如 我再设置一个 List<MyEntity> list = CommonUtil.myList1; 而在list未被释放的前提下 即使CommonUtil.myList1已经手动置null,jvm也不会回收这部分内存?而实际中 CommonUtil.myList1作为一个结果集,他会在很多出代码中用到。那究竟如何才能有效避免这个问题
如果手动设置null,JVM也能检测到,具体请不清空就不知道了
楼主说的是单纯的List<MyEntity> myList1变量,还是变量所引用的对象?
a)如果是myList1静态变量的话,它会被分配到方法区(存储描述类的相关信息的区域,如Class对象,该区域很少被GC(类的卸载),因为GC的要求条件很苛刻),除非它所在的类被卸载才会被回收(这个不难理解吧,类的静态变量,所有实例共享),否则一直存在于内存中(方法区),而类被卸载的条件必须同时满足----内存中没有该类的实例(对象),不再引用Class对象等(还有一个忘了)。所以跟你手动设置null没有关系,手动设置null只是不让他引用其他对象(其实也是赋值,只是特殊的值null),跟它自己没半毛钱关系。
b)如果是该变量引用的对象的话,一旦不被任何变量引用(没有指针指向他),当垃圾回收发生时便会被回收(通常情况都会),至于什么时候发生GC,我们无法控制,但通常是在内存无法为下一个对象分配足够的连续内存时触发。
好吧就说这些,楼主还有什么问题可以再交流
是的,不会回收,因为还有变量(List<MyEntity> list)引用那块内存。
如果楼主担心不被回收,可以在每次引用某个对象,操作完成后都手动释放引用。
即将list = null;这样就没有变量引用那块内存了,jvm便会回收
楼主如果顾忌这样的多个变量引用同一个对象的问题,就尽量不要把ComonUtil.myList1等变量赋值给其他变量就好了,如果非要赋值,记得将被赋值变量( List<MyEntity> list)置null就可以了
不知楼主是不是这个意思
哦 明白了 的确是的 要避免为static对象添加重复的引用 只要那块内存地址没有东西指向 jvm就会在适当时候回收