关于JAVA GC垃圾回收机制的疑问

a344581150 2013-06-19 08:39:47
对象A中有两个B类型的成员变量

class A{

B b1;
B b2;

}
A a1=new A();
A a2=new A();
a2.b1=a1.b1
a1=null;



这样 a1 和 a2中的b1都指向同一块内存
gc的时候,a1所占用的内存,此时a1所占用的内存b1还被引用,这样a1所占用的内存会释放掉吗。是不是只释放b2,b1不释放,还是整个a1的内存都不能释放?
...全文
303 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingherry 2013-06-24
  • 打赏
  • 举报
回复
a2引用了a1,对象引用其实只是内存地址。a1被回收了,不影响a2的。 LZ有这么个思考,对学习大有好处。
引用 13 楼 a1006570862 的回复:
楼主可以参考里面的内容,另外建议楼主看《深入理解java虚拟机》。书看精看分部分的 http://www.iteye.com/topic/244277
猿来是妳 2013-06-21
  • 打赏
  • 举报
回复
当出现new关键字的时候,JVM就会分配内存。new出来的对象是不一样的。楼主应该多了解一些内存的分配情况
haoshuai3717 2013-06-21
  • 打赏
  • 举报
回复
a1,a2都是类型为A的对象变量,其引用的对象中分别存在b1,b2两个对象变量,如果楼主没有显示定义A的缺省构造器的话,b1,b2均无引用,都是null。假定楼主的代码中是定义了无参构造器的,那最终a2.b1指向原先的a1.b1,当a1被复制null后,a1引用的对应就可以被GC了,但是当前a2.b1引用的内存是不被GC的。也就是说a1引用的对象并没有完全释放,这里存在两层引用关闭,只有不被任何对象变量引用的内存才释放的。 我是这么理解的。呵呵
a344581150 2013-06-20
  • 打赏
  • 举报
回复
引用 5 楼 czarten 的回复:
[quote=引用 4 楼 a344581150 的回复:] [quote=引用 3 楼 czarten 的回复:] [quote=引用 2 楼 a344581150 的回复:] [quote=引用 1 楼 czarten 的回复:] 我觉得不对吧,a1里面应该只有b1的引用吧?然后这个引用当然是可以销毁的 不确定
a1里面有2个成员变量,b1,b2啊。[/quote] 我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?[/quote] a1里面有b1的引用,现在把a1=null,但是a1里面的b1还a2引用着,这样a1能回收吗。[/quote] a1里面的b1没有被a2引用着啊,这两个都是引用,指向同一个对象[/quote] 我的意思就是 原来a1里面的b1指向的对象还被a2.b1引用着,这样把a1=null后,整个a1能回收吗。
raistlic 2013-06-20
  • 打赏
  • 举报
回复
楼主对 reference 赋值的理解有问题。
地下室森林 2013-06-20
  • 打赏
  • 举报
回复
楼主可以参考里面的内容,另外建议楼主看《深入理解java虚拟机》。书看精看分部分的 http://www.iteye.com/topic/244277
waynell 2013-06-20
  • 打赏
  • 举报
回复
gc的时候是有向图搜索,从静态变量,或者活跃线程的临时变量开始搜索,搜索不到的都可以回收。 a2不能被回收,a2中的b1就不能回收,b1中没有引用a1,所以a1可以回收
若鱼1919 2013-06-20
  • 打赏
  • 举报
回复
jvm使用的是根搜索算法,查找一个对象是否可以被回收。 如果存在根对象到一个对象的引用,那么这个对象就不能被回收。
hyunlong_java 2013-06-20
  • 打赏
  • 举报
回复
可以肯定a2的内存肯定不会被回收,从内存被GC回收的条件看,虽然a1=null,但是它引用的内存还是被a2站着,也就是这块内存还在gc链中,所以a1的内存应该也不会被回收,具体到A的 b1 b2,b1肯定不被回收,b2按正常推理也不会被回收,但是要是jvm做什么优化就不得而知
balabala_sean 2013-06-20
  • 打赏
  • 举报
回复
引用 6 楼 raistlic 的回复:
楼主对 reference 赋值的理解有问题。
楼主确实是没明白引用类型的赋值问题
balabala_sean 2013-06-20
  • 打赏
  • 举报
回复
a1 = null是会被收回的 a2.b1 = a1.b1这句话,a2.b1并不是指向a1.b1, 而是指向了a1.b1所引用的内存地址(此内存取名为C),相当于此时a1.b1和a2.b1都引用了C, a1 = null后,a1.b1对C的引用不存在了,而a2.b1此时终于媳妇熬成婆,可以独享C了。
你怎么了熊吉 2013-06-19
  • 打赏
  • 举报
回复
引用 4 楼 a344581150 的回复:
[quote=引用 3 楼 czarten 的回复:] [quote=引用 2 楼 a344581150 的回复:] [quote=引用 1 楼 czarten 的回复:] 我觉得不对吧,a1里面应该只有b1的引用吧?然后这个引用当然是可以销毁的 不确定
a1里面有2个成员变量,b1,b2啊。[/quote] 我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?[/quote] a1里面有b1的引用,现在把a1=null,但是a1里面的b1还a2引用着,这样a1能回收吗。[/quote] a1里面的b1没有被a2引用着啊,这两个都是引用,指向同一个对象
a344581150 2013-06-19
  • 打赏
  • 举报
回复
引用 3 楼 czarten 的回复:
[quote=引用 2 楼 a344581150 的回复:] [quote=引用 1 楼 czarten 的回复:] 我觉得不对吧,a1里面应该只有b1的引用吧?然后这个引用当然是可以销毁的 不确定
a1里面有2个成员变量,b1,b2啊。[/quote] 我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?[/quote] a1里面有b1的引用,现在把a1=null,但是a1里面的b1还a2引用着,这样a1能回收吗。
你怎么了熊吉 2013-06-19
  • 打赏
  • 举报
回复
引用 2 楼 a344581150 的回复:
[quote=引用 1 楼 czarten 的回复:] 我觉得不对吧,a1里面应该只有b1的引用吧?然后这个引用当然是可以销毁的 不确定
a1里面有2个成员变量,b1,b2啊。[/quote] 我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?
a344581150 2013-06-19
  • 打赏
  • 举报
回复
引用 1 楼 czarten 的回复:
我觉得不对吧,a1里面应该只有b1的引用吧?然后这个引用当然是可以销毁的 不确定
a1里面有2个成员变量,b1,b2啊。
你怎么了熊吉 2013-06-19
  • 打赏
  • 举报
回复
我觉得不对吧,a1里面应该只有b1的引用吧?然后这个引用当然是可以销毁的 不确定

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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