日期:2014-05-20  浏览次数:20832 次

关于Java的循环引用和内存泄露问题
网上经常有这么说的:Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。请问:什么是和根进程不可达?为何例子中的三个对象互相引用了就不会造成内存泄露?

------解决方案--------------------
内存泄露问题自然由gc去处理,根进程不可达应该就是没有程序能访问到它了
------解决方案--------------------
有向图可以这么理解:
ojbect是 节点, 引用是边。 方向表示引用/被引用的关系。

m1 = new Obj();
m2 = new Obj();

root.ref = m1;
m2.ref = m1;

root -> m1 <-m2

从root 开始, m2是不可抵达的,可以销毁。

root 是指 
1 thread stack 里的变量
2 静态域
------解决方案--------------------
学习了,看看think in java 或者 深入理解java虚拟机
------解决方案--------------------
建议看专门的文档,这东西别网上搜,都不准。
------解决方案--------------------
无用对象判断方法补充:沿着对象的引用的被饱含关系追溯不到根对象或活动线程时,则这个对象被称为无用对象.
------------------------------
如果JVM这么垃圾,还用置NULL才能回收,对List中装对象不能回收,对象相互引用不能回收,还能叫垃圾回收吗,JAVA绝对不会这么垃圾。

在开发中碰到过内存泄露,主要通过置null解决掉了,我并不是觉得对象有引用指向他,而是线程太多,抢占非常厉害,线程如果在等待中,就会存在其中实例的对象不能及时释放,累计起来就回泄露。

个人理解,在main方法中可以实例对象,也可以调用其他方法,
只要main方法不结束,main追溯指向的对象,其对象不会释放,main调用的其他方法中实例对象在方法结束时就会释放。
main结束,其方法中的对象也会释放,不释放主要针对在main方法中存在循环线程的情况。