第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会回收一些没有被引用的对象,但具体销毁哪些对象是不可预知的。也就是说一个对象如果没有任何引用,它也不一定会被立即回收。