zoukankan      html  css  js  c++  java
  • 谈谈java中的WeakReference

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

  • 相关阅读:
    【spring配置】——spring整合Quartz定时器
    Dubbo服务集群,常见容错机制:failover ,failsafe,failfase ,failback,forking
    dubbo 配置文件详解
    Windows 下Nexus搭建Maven私服
    linux下配置java环境
    nexus-2.11.4-01-bundle.tar.gz 下载地址
    XShell 连接 vm虚拟机中的redhat Linux系统
    APIO 2017 游记
    洛谷 P3128 [USACO15DEC]最大流Max Flow
    洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)
  • 原文地址:https://www.cnblogs.com/guiqw/p/5033464.html
Copyright © 2011-2022 走看看