关于java垃圾回收

List list = new LinkedList();
GcString s = new GcString("s");
list.add(s);
list.remove(0);
System.gc();
我这个样子写的代码 是不会调用GcString 类中的finalize()的方法,也就是对象s好像没有被回收,但是jvm到底会不会回收呢?希望研究过的前辈们给个准确答案。

也就是 当我从一个 list 中丢弃一个 对象时,那个对象会不会被回收?
希望你们能认真地回答我的问题啊;
补充一点:是不是因为我这里有 GcString s = new GcString("s"); 这个句柄导致了 对象s不能回收?

如果我这个对象是 直接 这么写呢 list.add(new GcString("s"));
求问 对性能要求比较高的项目中 怎么处理这种问题的,希望有经验的老手帮帮忙

1.“当我从一个 list 中丢弃一个 对象时,那个对象会不会被回收?”回答是:不一定,还要看那个对象有没有别的引用,如果没有其他任何代码引用那个对象,才【有可能】回收,注意,是有可能。 因为就算你调用System.gc();它只是告诉JVM:好吧,有垃圾,你看着办吧。但是,要知道【GC是JVM上优先级最低的线程】,一旦有稍微高优先级点的代码要执行,GC可能就被搁浅了。。。所以,调用System.gc();在大多数时候一点用都没有。

2.“是不是因为我这里有 GcString s = new GcString("s"); 这个句柄导致了 对象s不能回收?”不是,只要没有别的代码来引用s,JVM在【某个】时刻会检测到它是垃圾,并且回收。

3.“直接 这么写呢list.add(new GcString("s"));”,回答是,没必要!
项目中你要回收垃圾,直接赋值null就行了,这个就是最明确的通知JVM“这是个垃圾,有时间你就回收吧”。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-02
是垃圾 就会回收 不确定是什么时间
GcString s = new GcString("s");
如果变量出了作用域,就是垃圾
变量名 失去 指向就会变成垃圾
而对象失去变量名的指向 同样变成垃圾
比如匿名对象 本身就是垃圾
第2个回答  2010-09-02
当一个对象没有被引用时,即为垃圾(匿名对象用完后就是垃圾)
list.add(s);
list.remove(0);
s = null;//这样原来指向的那个对象将没有被引用,即为垃圾

System.gc();//有肯定的垃圾了,finalize方法一定会执行

对性能要求比较高的项目中 ,如果一个对象用完,后将其指向null
第3个回答  2010-09-02
调用 System.gc(); ,只是提醒jvm检查有没有要回收的对象,它不是明确的指定jvm去回收哪个对象,
这就跟线程里的notify() 查不多 ,只是一个提醒作用,所以具体不一定回收的

这里的情况是GcString s = new GcString("s"); ,s就指向了这个对象,就说对象还被引用,所以没有回收,
如果你后面再加一句s=null,此时对象就不被引用,但具体什么时候回收也不知道,那要看jvm什么时候检查到

所以项目中最好能手动释放资源,你可以看jdk源码里流的部分的close()方法,其实底层都是手动释放if(inputStream != null)
{
inputStream.invalidate();
inputStream = null;
}
第4个回答  2010-09-02
Ssystem.gc()并不能一定能实现手动回收。
垃圾回首是由jvm自动检测内存的,一旦发现内存超过作用域就会自动回收。而手动回收不一定能实现
第5个回答  2010-09-02
JAVA垃圾回收机制
当要NEW一些对象时JVM会回收一些没有被引用的对象,但具体销毁哪些对象是不可预知的。也就是说一个对象如果没有任何引用,它也不一定会被立即回收。
相似回答