讨论下强引用

lqsohu 2013-06-28 08:13:12
讨论下强引用把
1。
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
强引用必须设置他为空,gc才能去清除这段内存。
我感觉这个结论不是绝对的 要看引用对象的生命周期。

2. Object A = new Object ();这个是个强引用,但是如果A的生命周期结束, 例如在函数里这么写, A就会放到栈里, new 的对象放入堆里, A从栈指向堆, 从这个函数结束后, A就会自动出栈, 生命周期结束,由此在堆上的B就会被gc 回收!
如果在函数里想用gc 去回收堆上空间,必须要显示的说明 A=null 这样gc 才能去回收!


3. 如果在一个函数里这么写
Object A = new Object();
A= new B();
在这个函数中堆分配的空间 object 会被回收吗? 应该会把 他没有在Gc root 的回收链上!

4. 还有一个问题是 我们在写代码的时候一般不会让强引用主动设置为null, 这样的话会产生内存泄露吗?
...全文
263 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
n27741 2013-06-28
  • 打赏
  • 举报
回复
按thinking in java的提到的垃圾回收的方式 大概是说: 垃圾回收机,先去栈上面找引用指针 ,只要是栈上面在引用的就是有效的;否则就是垃圾。 所以重点是,栈上面的引用是否还在; 因为函数内定义的引用会出栈,出栈了引用就销毁了;时机一到就被GC回收了; 然后GC不是简单的解决内存泄露,内存泄露只是其目的之一;垃圾回收在解决内存碎片上很有用; 另外我个人认为,也正是因为GC的原因,Java可能更合适做服务器应用(内存处理效率高)?
北吹 2013-06-28
  • 打赏
  • 举报
回复
问题3:引用已经指向其他对象,可以被GC回收。 问题4:个人观点,这个和JAVA栈的运行有关。 当前方法对应的栈帧会在抛出异常或者返回时从线程栈中弹出去,局部变量区也在此栈帧里,所以当方法结束栈帧弹出,局部变量区也会失效,这个时候引用就不存在了,GC是可以回收的。所以写代码时,不用对局部变量的引用强制指定为null。
oh_Maxy 2013-06-28
  • 打赏
  • 举报
回复
垃圾回收的时候,会把没有被索引引用的对象回收掉的,所以第四点可以不用担心啦

62,635

社区成员

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

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