关于static声明的变量的占据的内存问题

iamkila 2012-09-24 12:04:16
工具类:
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回收垃圾对象?对于处理可变的静态变量内存回收方法,还有哪些?
...全文
487 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamkila 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

“例如 我再设置一个 List<MyEntity> list = CommonUtil.myList1; 而在list未被释放的前提下 即使CommonUtil.myList1已经手动置null,jvm也不会回收这部分内存?”
是的,不会回收,因为还有变量(List<MyEntity> list)引用那块内存。
如果楼主担心不被回收,可以在每次引用某个对象,操作完成后都手动释放引用。
即将……
[/Quote]

哦 明白了 的确是的 要避免为static对象添加重复的引用 只要那块内存地址没有东西指向 jvm就会在适当时候回收
iGoodLoser 2012-09-25
  • 打赏
  • 举报
回复
“例如 我再设置一个 List<MyEntity> list = CommonUtil.myList1; 而在list未被释放的前提下 即使CommonUtil.myList1已经手动置null,jvm也不会回收这部分内存?”
是的,不会回收,因为还有变量(List<MyEntity> list)引用那块内存。
如果楼主担心不被回收,可以在每次引用某个对象,操作完成后都手动释放引用。
即将list = null;这样就没有变量引用那块内存了,jvm便会回收
楼主如果顾忌这样的多个变量引用同一个对象的问题,就尽量不要把ComonUtil.myList1等变量赋值给其他变量就好了,如果非要赋值,记得将被赋值变量( List<MyEntity> list)置null就可以了
不知楼主是不是这个意思
iamkila 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

静态变量在类加载时初始化,在JVM停止时才释放,因此不会被回收!!!
[/Quote]
我的工具类中并没有进行初始化啊,我用的变量并不是常量,是一个可变的变量,初始时他们都没有指向
iamkila 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

jvm回收垃圾对象 是通过判断该对象是否还存在有给引用的情况,如果你的static对象没有给其他未释放的对象引用到,那设置为null之后,jvm在GC时应该是会回收的
[/Quote]
“如果你的static对象没有给其他未释放的对象引用到” 这句话是什么意思呢?
例如 我再设置一个 List<MyEntity> list = CommonUtil.myList1; 而在list未被释放的前提下 即使CommonUtil.myList1已经手动置null,jvm也不会回收这部分内存?而实际中 CommonUtil.myList1作为一个结果集,他会在很多出代码中用到。那究竟如何才能有效避免这个问题
liangtu 2012-09-24
  • 打赏
  • 举报
回复
静态变量在类加载时初始化,在JVM停止时才释放,因此不会被回收!!!
iamkila 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

1)"嗯 我现在的问题就是 我想知道jvm是否在我手动置null之后把该变量视作垃圾 ?"
楼主说的是单纯的List<MyEntity> myList1变量,还是变量所引用的对象?
a)如果是myList1静态变量的话,它会被分配到方法区(存储描述类的相关信息的区域,如Class对象,该区域很少被GC(类的卸载),因为GC的要求条件很苛刻),除非它所在的类被卸载才会被回收(这个不难理解吧……
[/Quote]

嗯 我所说的就是指该变量引用的对象 ,至于引用的话应该是放在栈区吧而且占据固定的内存值吧(这个不是我关心的)还有一个问题 就是我在三楼中提出的疑问
flysky08082 2012-09-24
  • 打赏
  • 举报
回复
jvm回收垃圾对象 是通过判断该对象是否还存在有给引用的情况,如果你的static对象没有给其他未释放的对象引用到,那设置为null之后,jvm在GC时应该是会回收的
iGoodLoser 2012-09-24
  • 打赏
  • 举报
回复
1)"嗯 我现在的问题就是 我想知道jvm是否在我手动置null之后把该变量视作垃圾 ?"
楼主说的是单纯的List<MyEntity> myList1变量,还是变量所引用的对象?
a)如果是myList1静态变量的话,它会被分配到方法区(存储描述类的相关信息的区域,如Class对象,该区域很少被GC(类的卸载),因为GC的要求条件很苛刻),除非它所在的类被卸载才会被回收(这个不难理解吧,类的静态变量,所有实例共享),否则一直存在于内存中(方法区),而类被卸载的条件必须同时满足----内存中没有该类的实例(对象),不再引用Class对象等(还有一个忘了)。所以跟你手动设置null没有关系,手动设置null只是不让他引用其他对象(其实也是赋值,只是特殊的值null),跟它自己没半毛钱关系。
b)如果是该变量引用的对象的话,一旦不被任何变量引用(没有指针指向他),当垃圾回收发生时便会被回收(通常情况都会),至于什么时候发生GC,我们无法控制,但通常是在内存无法为下一个对象分配足够的连续内存时触发。
好吧就说这些,楼主还有什么问题可以再交流
  • 打赏
  • 举报
回复
你开了一个大内存,当没有被任何对象使用的时候会被JVM清除掉。
如果手动设置null,JVM也能检测到,具体请不清空就不知道了
iamkila 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

jvm回收垃圾是不是及时的,是回收那些它认为是垃圾的不需要空间。
[/Quote]
嗯 我现在的问题就是 我想知道jvm是否在我手动置null之后把该变量视作垃圾 ?如果不是,那我置null就没有任何意义好让我换一种清理缓存的方法
  • 打赏
  • 举报
回复
jvm回收垃圾是不是及时的,是回收那些它认为是垃圾的不需要空间。

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧