(一)强引用
强引用是我们平常最常见的引用类型,通常就是如A a = new A()。垃圾回收器对待强引用的策略是:当进行垃圾回收的时候,如果内存不够用,对象的强引用又被使用,垃圾回收器是不会回收具有强引用类型的对象。并且会抛出OutOfMemoryError。
(二)软引用
垃圾回收器对待软引用的策略是:当进行垃圾回收时,如果内存够用,他不会释放具有软引用的对象。如果内存不够用,它就会去释放具有软引用类型的对象。
软引用常见的使用场景就是缓存实现。
例子:图形编辑器(https://www.cnblogs.com/mjorcen/p/3968018.html)
public class ImageData {
private String path;
private SoftReference<byte[]> dataRef;
public ImageData(String path) {
this.path = path;
dataRef = new SoftReference<byte[]>(new byte[0]);
}
private byte[] readImage() {
return new byte[1024 * 1024]; //省略了读取文件的操作
}
public byte[] getData() {
byte[] dataArray = dataRef.get();
if (dataArray == null || dataArray.length == 0) {
dataArray = readImage();
dataRef = new SoftReference<byte[]>(dataArray);
}
return dataArray;
}
}
该程序会把图像文件的全部内容都读取到内存中,以方便进行处理。而用户也可以同时打开多个文件。当同时打开的文件过多的时候,就可能造成内存不足。如果使用软引用来指向图像文件内容的话,垃圾回收器就可以在必要的时候回收掉这些内存。
在运行上面程序的时候,可以使用 -Xmx 参数来限制JVM可用的内存。由于软引用所指向的对象可能被回收掉,在通过get方法来获取软引用所实际指向的对象的时候,总是要检查该对象是否还存活。
(三)弱引用
垃圾回收器对待弱引用的策略是:当进行垃圾回收时,垃圾回收器只要发现弱引用,就会回收。
拿上面介绍的场景举例,我们使用一个指向Product对象的弱引用对象来作为HashMap的key,只需这样定义这个弱引用对象:
| 1 2 |
|
现在,若引用对象weakProductA就指向了Product对象productA。那么我们怎么通过weakProduct获取它所指向的Product对象productA呢?很简单,只需要下面这句代码:
| 1 |
|
实际上,对于这种情况,Java类库为我们提供了WeakHashMap类,使用和这个类,它的键自然就是弱引用对象,无需我们再手动包装原始对象。这样一来,当productA变为null时(表明它所引用的Product已经无需存在于内存中),这时指向这个Product对象的就是由弱引用对象weakProductA了,那么显然这时候相应的Product对象时弱可达的,所以指向它的弱引用会被清除,这个Product对象随即会被回收,指向它的弱引用对象会进入引用队列中。
http://www.importnew.com/21206.html
引用队列
下面我们来简单地介绍下引用队列的概念。实际上,WeakReference类有两个构造函数:
| 1 2 3 4 |
|
我们可以看到第二个构造方法中提供了一个ReferenceQueue类型的参数,通过提供这个参数,我们便把创建的弱引用对象注册到了一个引用队列上,这样当它被垃圾回收器清除时,就会把它送入这个引用队列中,我们便可以对这些被清除的弱引用对象进行统一管理。
(四)虚引用
虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入ReferenceQueue中。注意哦,其它引用是被JVM回收后才被传入ReferenceQueue中的。由于这个机制,所以虚引用大多被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有ReferenceQueue,使用例子:
PhantomReference<String> prf = new PhantomReference<String>(new String("str"), new ReferenceQueue<>());
可用场景:
对象销毁前的一些操作,比如说资源释放等。Object.finalize()虽然也可以做这类动作,但是这个方式即不安全又低效。
https://blog.youkuaiyun.com/u014532217/article/details/79184412
本文深入解析Java中的四种引用类型:强引用、软引用、弱引用和虚引用,探讨它们的特性和应用场景,如缓存管理和资源释放。
2078

被折叠的 条评论
为什么被折叠?



