在java中谈论WeakReferencence。
在java语言中,对象的引用分为四个等级, 强引用 、软引用,弱引用,虚引用。
本文仅对java中的弱引用进行分析,如有出入请多指正。
在研究弱引用之前,首先要讨论一个概念:目标可以达到什么,对象不能达到什么。
实际上很简单,我举个例子:
现在有以下两种类型的class A class B,他们两个类别的例子是在JVM上生成的。 instance a instance b
有以下关系类型:
A a = new A();
B b = new B();
生成了两个强引用对象,好吧,那么这个时候我就做一些修改:
A a = new A();
B b = new B(a);
在默认构造函数中,B需要一个A的案例作为参数,所以在这个时候, A和B产生了依赖性,也可以说A和B产生了依赖性,我们再用一张接近内存结构的图表来表达:
A是目标A的引用,B是对象B的引用,对象B也依赖于目标A,所以在这个时候,我们认为目标A可以从对象B到达。
所以我又改变了代码。
A a = new A();
B b = new B(a);
a = null;
A对象引用A是空的,A不再指向目标A地址。我们都知道,当一个目标不再被其他对象引用时,它将被GC回收。显然,A及时。=null,所以A的目标也是不可能被回收的,因为B仍然依赖于A,此时,造成内存泄漏!
那怎样避免上述例子中的内存泄漏呢?
很简单:
A a = new A();
B b = new B(a);
a = null;
b = null;
此时B目标没有被引用,A目标只被B对象引用。即便如此,GC也可以同时回收,因为它们在一个无法到达的地区。
弱点引用来了!
A a = new A();
WeakReference wr = new WeakReference(a);
//B b = new B(a);
当 a=null ,这个时候A只是被弱引用依赖,所以GC会马上回收A的目标,这就是弱引用的好处!他可以帮助你合理释放目标,在你对对象结构和拓扑不是很清楚的情况下造成不必要的内存泄漏!!
在java语言中,对象的引用分为四个等级, 强引用 、软引用,弱引用,虚引用。
本文仅对java中的弱引用进行分析,如有出入请多指正。
在研究弱引用之前,首先要讨论一个概念:目标可以达到什么,对象不能达到什么。
实际上很简单,我举个例子:
现在有以下两种类型的class A class B,他们两个类别的例子是在JVM上生成的。 instance a instance b
有以下关系类型:
A a = new A();
B b = new B();
生成了两个强引用对象,好吧,那么这个时候我就做一些修改:
A a = new A();
B b = new B(a);
在默认构造函数中,B需要一个A的案例作为参数,所以在这个时候, A和B产生了依赖性,也可以说A和B产生了依赖性,我们再用一张接近内存结构的图表来表达:
A是目标A的引用,B是对象B的引用,对象B也依赖于目标A,所以在这个时候,我们认为目标A可以从对象B到达。
所以我又改变了代码。
A a = new A();
B b = new B(a);
a = null;
A对象引用A是空的,A不再指向目标A地址。我们都知道,当一个目标不再被其他对象引用时,它将被GC回收。显然,A及时。=null,所以A的目标也是不可能被回收的,因为B仍然依赖于A,此时,造成内存泄漏!
那怎样避免上述例子中的内存泄漏呢?
很简单:
A a = new A();
B b = new B(a);
a = null;
b = null;
此时B目标没有被引用,A目标只被B对象引用。即便如此,GC也可以同时回收,因为它们在一个无法到达的地区。
弱点引用来了!
A a = new A();
WeakReference wr = new WeakReference(a);
//B b = new B(a);
当 a=null ,这个时候A只是被弱引用依赖,所以GC会马上回收A的目标,这就是弱引用的好处!他可以帮助你合理释放目标,在你对对象结构和拓扑不是很清楚的情况下造成不必要的内存泄漏!!
本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。
免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com




