Java中没有指针的概念,而引用就是一个弱化的指针,保证开发不能任意操作内存。最近整理了一下之前不明白的各种级别引用:强引用、软引用、弱引用、虚引用,它们的特点和应用场景汇总如下:
1、强引用
如果一个对象具有强引用,GC绝不会回收它;当内存空间不足,JVM宁愿抛出OutOfMemoryError错误。一般new出来的对象都是强引用,如下
-
- User strangeReference=new User();
2、软引用
如果一个对象具有软引用,当内存空间不足,GC会回收这些对象的内存,使用软引用构建敏感数据的缓存。
在JVM中,软引用是如下定义的,可以通过一个时间戳来回收,下面引自JVM:
- public class SoftReference<T> extends Reference<T> {
-
-
-
-
- static private long clock;
-
-
-
-
-
-
- private long timestamp;
-
-
-
-
-
-
-
- public SoftReference(T referent) {
- super(referent);
- this.timestamp = clock;
- }
-
-
-
-
-
-
-
-
-
-
- public SoftReference(T referent, ReferenceQueue<? super T> q) {
- super(referent, q);
- this.timestamp = clock;
- }
-
-
-
-
-
-
-
-
-
- public T get() {
- T o = super.get();
- if (o != null && this.timestamp != clock)
- this.timestamp = clock;
- return o;
- }
-
- }
软引用的声明的借助强引用或者匿名对象,使用泛型SoftReference<T>;可以通过get方法获得强引用。具体如下:
-
- SoftReference<User>softReference=new SoftReference<User>(new User());
- strangeReference=softReference.get();
3、弱引用
如果一个对象具有弱引用,在GC线程扫描内存区域的过程中,不管当前内存空间足够与否,都会回收内存,使用弱引用 构建非敏感数据的缓存。
在JVM中,弱引用是如下定义的,下面引自JVM:
- public class WeakReference<T> extends Reference<T> {
-
-
-
-
-
-
-
- public WeakReference(T referent) {
- super(referent);
- }
-
-
-
-
-
-
-
-
-
- public WeakReference(T referent, ReferenceQueue<? super T> q) {
- super(referent, q);
- }
-
- }
弱引用的声明的借助强引用或者匿名对象,使用泛型WeakReference<T>,具体如下:
-
- WeakReference<User>weakReference=new WeakReference<User>(new User());
4、虚引用
如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列联合使用,虚引用主要用来跟踪对象 被垃圾回收的活动。
在JVM中,虚引用是如下定义的,下面引自JVM:
- public class PhantomReference<T> extends Reference<T> {
-
-
-
-
-
-
-
-
- public T get() {
- return null;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public PhantomReference(T referent, ReferenceQueue<? super T> q) {
- super(referent, q);
- }
-
- }
虚引用PhantomReference<T>的声明的借助强引用或者匿名对象,结合泛型ReferenceQueue<T>初始化,具体如下:
-
- PhantomReference<User> phantomReference=new PhantomReference<User>(new User(),new ReferenceQueue<User>());
5.应用实例
待添加
asdasd