Java弱引用(WeakReference)的理解与使用

Java弱引用(WeakReference)的理解与使用当一个对象仅仅被weakreference指向,而没有任何其他strongreference指向的时候,如果GC运行,那么这个对象就会被回收。如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。

在Java里, 当一个对象被创建时, 它被放在内存堆里. 当GC运行的时候, 如果发现没有任何引用指向该对象, 该对象就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 2)GC被运行。

Java对于简单的情况, 手动置空是不需要程序员来做的, 因为在java中, 对于简单对象, 当调用它的方法执行完毕后, 指向它的引用会被GC回收,

实际中我们写代码,往往是通过把所有指向某个对象的referece置null实现,如:

Person p = new Person("张三",18,"男");//强引用
...
p=null;//不再使用的时候置null

很明显,手动置null对象对于程序员来说, 是一件繁琐且违背自动回收机制的。

Java对于简单的情况, 如方法中的产生的局部对象,是不需要程序员来手动置空,  当调用它的方法执行完毕后, 指向它的引用会被GC回收。而复杂一点的情况,比如使用cache,因为cache的对象正是程序运行需要的, 那么只要程序正在运行, cache中的引用就不会被GC,那么随着cache中的引用越来越多, GC无法回收的对象也越来越多, 无法被自动回收,此时就必须有开发者来进行处理回收,显然也违背了java自动回收机制。

对此,java中引入了弱引用(WeakReference)。

当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收。如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。

WeakReference的语法:

WeakReference<T> weakReference = new WeakReference<T>(referent);

当要获得weak reference引用的对象时, 首先需要判断它是否已经被回收:

weakReference.get();

 如果此方法为空, 那么说明weakReference指向的对象已经被回收了。

下面一个WeakReference的栗子:

Person类:

package com.yx.test.model;

/**
 * Person
 *
 * @author yx
 * @date 2019/11/26 16:28
 */
public class Person {
    private String name;
    private int age;
    private String sex;

    public Person() {
    }

    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

测试类TestWeakReference:

package com.yx.test.reference;

import com.yx.test.model.Person;

import java.lang.ref.WeakReference;

/**
 * TestWeakReference
 *
 * @author yx
 * @date 2019/11/26 16:30
 */
public class TestWeakReference {
    public static void main(String[] args) {
        Person p = new Person("张三",18,"男");
        WeakReference<Person> weakPerson = new WeakReference<Person>(p);
        int i=0;
        while(true){
            if(weakPerson.get()!=null){
                i++;
                System.out.println("Object is alive for "+i+" loops - "+weakPerson);
            }else{
                System.out.println("Object has been collected.");
                break;
            }
        }
    }
}

运行结果:

p is alive for 1 loops - java.lang.ref.WeakReference@330bedb4
...
p is alive for 62331 loops - java.lang.ref.WeakReference@330bedb4
p is alive for 62332 loops - java.lang.ref.WeakReference@330bedb4
p has been collected.

可以看到,在while循环执行数万次后,p被回收了。

多次测试运行程序,发现p回收时循环执行的次数是不确定的,这个很容易理解:因为这是由GC运行的不确定性所确定的。

小结:

1.Java中当一个对象仅被一个弱引用引用时,如果GC运行, 那么这个对象就会被回收。

2.弱引用的一个特点是它何时被回收是不可确定的;

相关知识拓展:

强引用、软引用、弱引用、虚引用

Java弱引用(WeakReference)的理解与使用
微信扫描关注更精彩

今天的文章Java弱引用(WeakReference)的理解与使用分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/8422.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注