关于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的内存都不能释放?
...全文
310 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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的引用吧?然后这个引用当然是可以销毁的 不确定
绝对想你所想,超乎想象!够详细,够给力! 目录 1. Jvm内存空间结构是什么样的? 1 程序计数器 1 Java栈 1 本地方法栈 2 堆 2 方法区 3 2. Jvm堆内存的划分结构和优化 3 2.1. 原理 6 2.1.1. 年轻代 6 2.1.2. 年老代 6 2.1.3. 持久代 7 2.2. 参数说明 8 2.3. 疑问解答 9 2.4. 垃圾回收器选择 10 2.4.1. 串行收集器 10 2.4.2. 并行收集器(吞吐量优先) 10 2.4.3. 并发收集器(响应时间优先) 11 2.4.4. 其它垃圾回收参数 11 2.5. 辅助信息参数设置 12 2.6. 关于参数名称等 13 3. JVM服务参数调优实战 14 3.1. 大型网站服务器案例 14 3.2. 内部集成构建服务器案例 15 4. 常量池在jvm的哪个空间里边? 17 5. jvm垃圾回收是什么时候触发的? 17 5.1. 那究竟GC为我们做了什么操作呢? 17 5.1.1. Jvm怎么判断对象可以回收了? 18 5.2. 下面我们来看一下几种垃圾收集算法 18 5.2.1. 在JDK1.2之前,使用的是引用计数器算法, 18 5.2.2. 根搜索算法 19 5.2.3. 引用的分类 19 5.3. 方法区也是会被回收的 20 5.4. 下面我们来逐一介绍一下每个垃圾回收器。 22 5.4.1. 1、 Serial收集器 22 5.4.2. 2、 ParNew收集器 23 5.4.3. 3、 ParallelScavenge 23 5.4.4. 4、 ParallelOld 24 5.4.5. 5、 SerialOld 24 5.4.6. 6、CMS 24 5.4.7. 7、 GarbageFirst(G1 ) 26 6. 常量池如何触发的垃圾回收? 28 7. 垃圾回收从哪里开始检测树进行回收?根节点是什么? 28 7.1. 目前java中可作为GC Root的对象有 29 8. Redis怎么判断对象可以清理了? 29 9. Redis怎么提高命中率? 29 10. Finalize中调用垃圾回收方法,再调用方法会回收么? 29 11. Int进行自增操作,如何保证线程安全? 30 12. Int a=1是原子方法,布尔类型进行赋值是原子方法么? 30 12.1. 多线程原子操作的安全性 31 13. Cas怎么实现unsafe? 32 13.1. Unsafe 32 13.2. CAS 32 13.3. 由CAS分析AtomicInteger原理 33 13.4. CAS的缺点 35 14. Map数据结构? 35 14.1. 一、定义 36 14.2. 二、构造函数 36 14.3. 三、数据结构 36 14.4. 四、存储实现:put(key,vlaue) 38 14.5. 五、读取实现:get(key) 41 15. 一百万数据放Arraylist数组,怎么放? 在哪个代? 42 15.1.1. 调整数组容量 42 16. Hashmap和 concurrentHashmap除了线程安全 还有什么区别,put的时候是怎么处理的。 43 17. 数据库组合索引,储存在一个叶子节点还是多个? 44 17.1. 索引的利弊与如何判定,是否需要索引: 44 17.1.1. 索引的好处 44 17.1.2. 索引的弊端 44 17.1.3. 如何判定是否须要创建索引 44 17.2. 复合索引优化 45 17.3. 下面是一些常见的索引限制问题 45 17.3.1. 使用不等于操作符(<>, !=) 45 17.3.2. 使用 is null 或 is not null 45 17.3.3. 使用函数 45 17.3.4. 比较不匹配的数据类型 46 17.4. 关于索引的排序 46 18. 数据库没有orderby默认如何排序。 46 19. 分布式事务如何实现。 46 19.1. 1 事务/分布式事务 47 19.1.1. 1.1 事务 47 19.1.2. 1.2 分布式事务与 XA 规范 47 19.2. 2 两阶段提交协议 47 19.2.1. 2.1 预提交阶段 48 19.2.2. 2.2 提交阶段 48 19.3. 3 分布式事务应用框架 48 19.3.1. 3.1 角色 48 19.3.2. 3.2 交互时序 49 19.3.3. 3.3 关键点 50 19.3.4. 参考 50 20. Jvm底层源码 51 21. 二叉树怎么实现的? 51 22. Executourservice 数据结构。哪种只能执行一个线程。 Cache怎么实现的 fixed线程如果中断,线程回自己销毁么? 51 23. 栅栏的原理和实现。 51 23.1. 1. CyclicBarrier简介 51 23.2. 2. CyclicBarrier数据结构 52 23.3. 3. CyclicBarrier源码分析(基于JDK1.7.0_40) 52 23.3.1. 3.1 构造函数 52 23.3.2. 3.2 等待函数 53 23.4. 4. CyclicBarrier的使用示例 57 23.4.1. 示例1 57 23.4.2. 示例2 59 24. Blockingqueue有几种形式?各自的编码方式。 72 24.1. Queue接口 72 24.2. BlockingQueue接口 73 24.2.1. ArrayBlockingQueue 74 24.2.2. LinkedBlockingQueue 78 24.2.3. LinkedBlockingDeque(双向并发阻塞队列) 84 24.2.4. PriorityBlockingQueue(优先阻塞队列) 85 24.2.5. 总结一下阻塞队列 90 25. Tomcat 如何管理servlet? 90 26. Servlet生命周期 90 27. 没有缓存,如何实现领券并发操作? 92

62,635

社区成员

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

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