java在运行过程中会有一个stack记录正在使用的reference,还有一个static storage用于存储静态类的数据和方法。每次gc,都会以此没依据查找内存中的每个对象,如果没有上述两个地方的reference指向的object便会被清除。楼主的例子中应该只有当forlong设置为null时,TestCollect的实例才会被回收。java中主要的机制是:stop and copy 和 and sweep 两种方式。另:gc只有当内存吃紧的时候(这个由jvm定),才会执行(为保证程序运行的速度)。除非你写上代码System.gc()
还有分配内存的时候,是不是尽量让temp对象和outer对象处于连续的空间中呢?
还希望大家都来讨论一下虚拟机在内存处理上的一些问题.
public String outer=new String("testouter");
private String inner=new String("testinner");
public void finalize(){
System.out.println("finalize");
}
}class TestCollect{
public static void main(String[] args){
Collect temp=new Collect();
String forlong=temp.outer;
temp=null;
System.gc();
}
}
上面的片断可以说明temp引用被置空后就可以被回收,
不管有没有对其内部对象有没有引用都是这样的,
http://dev.csdn.net/develop/article/60/60811.shtm
可以看看这篇文章,说的很清楚。
实际上一个原则就是尽量早的在对象无用的时候置为null,以便gc可以在最近的一次处理把垃圾回收。