- 强引用:
我们平时最常使用的基本对象引用,JVM不会回收强引用类型对象,即使内存不足导致OOM也不会回收。
实现一个强引用
User user = new User()
- 软引用:
内存空间足够的情况下,JVM不会回收软引用对象,如果内存空间不足,那么软引用对象会被回收。
只要JVM没有回收,软引用就可以继续被程序使用,因此可以用软引用存放一些内存敏感的缓存。只要内存足够,对象就保持永远不被回收。
实现软引用:java.lang.ref.SoftReference
SoftRenference softRenfernce = new SoftRenference(new User());
// 获取软引用对象
System.out.println(softReference.get())
- 弱引用:垃圾回收线程只要扫描到弱引用对象,不管内存空间是否足够,都会进行回收。
弱引用可以用来实现一些规范化映射,如:WeakHashMap,当key或者value不再被引用时可以自动回收。
实现一个弱引用:java.lang.ref.WeakReference
WeakReference weakReference = new WeakReference(new User());
System.out.println(weakReference.get())
- 虚引用:虚引用不决定对象的生命周期,如果一个对象仅持有虚引用,那么他就和没有任何引用一样,任何时候都可以被JVM回收。
虚引用主要用来跟踪对象被垃圾回收器回收的话,虚引用必须和引用队列(ReferenceQuque)联合使用,当垃圾回收器准备回收一个对象时,如果发现他还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之前关联的引用队列。
实现一个虚引用:java.lang.ref.ReferenceQueue
// 引用队列
ReferenceQueue<User> queue = new ReferenceQueue<> ();
// 构建虚引用对象
PhantomReference phantomReference = new PhantomReference(new User());
// 获取虚引用对象
System.out.println(phantomReference .get())
ReferenceQueue(引用队列)是必须的,当对象回收时会放入其中,它最大的作用是跟中对象的回收。
网友评论