50,530
社区成员
发帖
与我相关
我的任务
分享
hashmap=new HashMap();
这种,gc干活的时候会回收
hashmap=null;
这种则不会,当栈帧弹出的时候,hashmap这个变量已经没了
class A {
int i=1;
}
class B {
A a = new A();
}
public static void main(String[] args){
// 代码从这里开始执行。
B b = new B();
// 构造 B 对象后,b引用是函数的局部变量,b保存在栈里面,而b指向的对象在堆区。
// B对象的数据在堆区,我们发现 B 里面有个A对象。
// A对象的引用 a 是 B 对象的成员变量,所以,引用 a 作为B 的数据成员,保存在堆区了。
// 引用a指向的A对象,它的数据也会保存在堆区,里面有 i 变量。
b = null;
// 下面就有机会对B对象进行垃圾回收了,因为 b=null 之后,B对象的引用计数为零了。
// 对B对象进行回收时,发现有A对象的引用a,所以,会去除a的引用关系,类似于 b.a=null 的操作。
// 之后,我们观察到 A 对象由于上一步的引用关系去除,它的引用计数也为零了,那么,它也具备被回收的条件了,
// 但,有可能下次清理时才会被回收,也有可能本次清理时就会被回收,具体要看堆区的存储状况以及垃圾回收的算法。
}