您现在的位置是:首页 > 正文

谈谈java中的WeakReference

2024-04-01 06:39:32阅读 1

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,那么这个时候我们认为从对象B是可以到达对象A的。

于是我又修改了一下代码

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这个对象,这就是弱引用的好处!他可以在你对对象结构和拓扑不是很清晰的情况下,帮助你合理的释放对象,造成不必要的内存泄漏!!


来源:http://blog.csdn.net/matrix_xu/article/details/8424038

网站文章

  • 多图--两种方法----C++改变常成员函数(Const)的值

    多图--两种方法----C++改变常成员函数(Const)的值

    常成员函数: <1> 成员函数后面加了const。<2> 不能修改类的成员,不能对它赋值,只是一个可读函数。提高程序的可读性,可靠性。如图,fun函数是常成员函数: 将i的值改为100,则会报错: 第一种修改方法:用mutable关键字: 看效果:第二种修改方法:用this指针: 有什么问题欢迎留言!~~~~...

    2024-04-01 06:39:25
  • java wildcard_java泛型 wildcard

    import java.util.ArrayList;import java.util.List;public class WildCard {public static void main(Stri...

    2024-04-01 06:38:42
  • hbase对HDFS开启短路读功能

    1.增加短路读路径mkdir /var/lib/hadoop-hdfs chmod 775 /var/lib/hadoop-hdfschown hdfs:root -R /var/lib/hadoop...

    2024-04-01 06:38:30
  • 排序算法之快排

    快速排序是常见排序算法中速度最快的,最好的和平均时间复杂度为O(nlogn),空间复杂度为O(nlogn),是一个不稳定的排序方法。其实现过程如下:1、取出第开始的元素作为测试值,先从右侧开始遍历;2、将测试值与右侧值比较,右侧值若大于等于测试值,则继续左移再与测试值比较。若右侧遍历到测试值的下一个元素仍找不到小于测试值的元素,则证明测试值为当前序列中最小的元素,其位置不变,跳过步骤3

    2024-04-01 06:37:46
  • webstorm 配置连接Linux环境的docker服务

    webstorm 配置连接Linux环境的docker服务

    可以看到docker.service的路径:/usr/lib/systemd/system/docker.service。2)输入命令【systemctl status docker.service】...

    2024-04-01 06:37:39
  • 专题:Secure Shell软件(简称SSH的)

    Xshell、MobaXterm等5款主流SSH客户端对比如今大多数的网民用户都是使用的Windows操作系统,但如果想要连接Linux服务器来进行文件之间的传送,那就需要一个Secure Shell...

    2024-04-01 06:37:31
  • 区块链技术发展现状的思考

    感觉现在的区块链发展态势和10几年前的网格计算很相似,当年网格计算的思想曾经打动了很多人,包括IBM在内的很多公司,都曾积极参与研究,特别是国内的院校、科研机构,甚至曾经认为是第二次互联网革命、中国在互联网技术领域赶超美国的一次机遇。但是后来的实际情况表明,网格计算的思想有其合理性和价值,但最终真正被社会接受的是云计算,二者之间的发展差异表明,商业模式是关键,找到合适的、可以被社会接受的商业模式,

    2024-04-01 06:37:23
  • Flutter 点击按钮弹出底部弹框

    Flutter 点击按钮弹出底部弹框

    Flutter 点击按钮弹出底部弹框

    2024-04-01 06:36:42
  • solrcloud,tomcat,外部zookeeper配置详解

    solrcloud,tomcat,外部zookeeper配置详解

    之前由于在项目中使用的solr3.6,服务器总是莫名其妙的挂掉,各种解决未果,于是尝试换到solr4,想试试solrcloud和zookeeper集群看看效果怎么样,实际效果比3.6稳定很多,下面说一下项目中我们的具体现在一个测试的配置。 我们配置3台zookper服务器和3台solr服务器,由于没有多台机器测试,zookeeper的集群都在一台服务器上,tomcat部署在3台服务器上。 zoo

    2024-04-01 06:36:34
  • windows 下搭建 git 服务器 gogs

    windows 下搭建 git 服务器 gogs

    2019独角兽企业重金招聘Python工程师标准>>> ...

    2024-04-01 06:36:26