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则不会。