GC回收相互引用对象
2017-10-27 15:15
225 查看
java中有垃圾回收机制,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况,当对象不再被引用的时候,,对象将自动被垃圾回收器从内存中清除掉。
案例:两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的(可达性分析算法:通过GC roots的对象作为起点,从这个节点向下搜索,搜索所走过的路径称为引用链,当一个GC对象没有任何引用链相连的时候,则证明此对像是不可用的)。
java代码实现两个对象的相互引用案例一:
内存分析:堆栈是为了让程序员能够更好的理解java对象的空间分配,真实的内存要复杂更多
java代码实现两个对象的相互引用案例二:
public class TestGC {
private Object object=null;
public static void main(String[] args){
TestGC t=new TestGC();
TestGC t1=new TestGC();
t.object=t1;
t1.object=t;
t=null;
t1=null;
System.gc();
}
}
内存分析:
案例:两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的(可达性分析算法:通过GC roots的对象作为起点,从这个节点向下搜索,搜索所走过的路径称为引用链,当一个GC对象没有任何引用链相连的时候,则证明此对像是不可用的)。
java代码实现两个对象的相互引用案例一:
public class Dd { public static void main(String[] args){ Dd d=new Dd();//实例化外部类 ff f=d.new ff();//实例化内部类需要外部类的引用 ff f1=d.new ff(); f.setd(f1); f.setd(f); } privateclass ff { Byte[] b=new Byte[100]; ff f3=null; public void setd(ff f2){ f3=f2; } } }
内存分析:堆栈是为了让程序员能够更好的理解java对象的空间分配,真实的内存要复杂更多
java代码实现两个对象的相互引用案例二:
public class TestGC {
private Object object=null;
public static void main(String[] args){
TestGC t=new TestGC();
TestGC t1=new TestGC();
t.object=t1;
t1.object=t;
t=null;
t1=null;
System.gc();
}
}
内存分析:
相关文章推荐
- 浅谈两个相互引用的对象是否会被GC回收
- JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
- 对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- 对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- Java对象循环引用,Java gc 如何回收
- WeakReference(弱引用)让GC需要时回收对象
- 疑问线程对象Thread启动之后,没有任何引用引用这个Thread对象,是否会被GC回收掉
- JVM GC之一找出不可达对象并回收
- javascript基础(对象,对象属性,属性基本和引用数据类型,字面量创建对象,垃圾回收,属性的枚举)(十三)
- System.gc与finalize以及Thread对象何时被回收
- java虚拟机GC是这样回收对象的吗?
- Java中单例对象不会被GC回收
- java对象引用和回收
- JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
- Python 对象引用、可变性和垃圾回收
- 配合GC,JavaScript性能优化之:邪恶闭包,对象引用清除深入探究
- Java的垃圾回收机制,GC,和变量的创建和删除的关系(即变量的作用域,for循环中的某个变量,出了for循环再引用就会报错了,因为该变量已经被从内存中删掉了)
- 设计模式拾荒之中介者模式(Mediator Pattern): 避免对象间错综复杂的相互引用