实战 java 的弱引用

Java 里的引用

引用有很多种类型, 比如强引用, 软引用,弱引用,虚引用。这里我们只介绍以下 Java 里的弱引用, 其他的不会更多描述, 感兴趣的小伙伴可以自行Google啦。

强引用

强引用很简单, 就是直接对变量赋值后, 这个变量就是强引用到对象object的。也就是说在有用到下面 user 的代码块或者方法区,即使 JVM 发生 GC 也不会回收掉这个对象。

User user = new User();

当代码块或者方法执行完毕, user 的强引用就会消失,JVM 就会进行垃圾回收(回收方法依赖当前配置的回收机制)

弱引用

java 提供了2个类实现弱引用:

//当object,也就是下面的user被GC回收,会将弱引用对象放到队列里,也就是 userWeakReference 这个对象
ReferenceQueue<User> referenceQueue = new ReferenceQueue<>();
//构造参数中的 referenceQueue 是可选的
WeakReference<User> userWeakReference = new WeakReference<>(new User(), referenceQueue);

int i = 0;
while (true) {
   System.out.println(i++);// 记录执行多少次后user对象被回收
   if (userWeakReference.get() == null) {
        System.out.println("执行 " + i + " 次后 user 被回收掉了");
        break;
   }
}

//referenceQueue 放入的不是 user 对象, 即使拿出来 userWeakReference.get()也是null,user 已经被回收了
Reference weakRef;
while (true) {
    if ((weakRef = referenceQueue.remove()) != null) {
        System.out.println("user 被回收了!");
        System.out.println(weakRef);
        break;
    }
}

作用

弱引用主要用在一些内存不够的缓存中,可以自动地帮你清理掉已经不再使用的对象。java 中比较常见的就是WeakHashMap, 它就是用这2个类实现的。如果你用HashMap存object是不会及时清理掉存入的数据的,内存不够就是跑出oom异常,而WeakHashMap则不会。

发表评论

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

Scroll to Top