在java中谈论WeakReferencence。

2023-05-27


在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