java中我们通过一个引用指向内存中对象。
//创建一个引用,引用可以独立存在,并不一定需要与一个对象关联 User user; user = new User(); 复制代码
user是引用, 通过‘=’指向了内存中的对象。
JDK1.2后,根据对对象的引用强度不同,将引用分为4种类型。
平时使用最多,最普遍的引用。
User user; user = new User();//强引用 复制代码
只要user 指向 User对象。User对象就不会被回收。
user = null;断开了引用,User对象不可达,会被回收。 复制代码
我们可以通过 SoftReference
来定义一个软引用
SoftReference<User> softRef=new SoftReference<User>(new User());//软引用 复制代码
解释下: 对象只有软引用 对象有两种引用的情况
User user = new User();//强引用 SoftReference<User> softRef=new SoftReference<User>(user);//软引用 复制代码
对象只有软引用情况
SoftReference<User> softRef=new SoftReference<User>(new User());//软引用 复制代码
或
User user = new User();//强引用 SoftReference<User> softRef=new SoftReference<User>(user);//软引用 user = null;//断开了强引用。 此时只有软引用。 复制代码
软引用可与引用队列(ReferenceQueue)联合使用,在创建软引用时,关联ReferenceQueue。如果软引用引用的对象被回收时,Java虚拟机会把这个软引用加入到与之关联的引用队列中。
软引用可用作内存敏感的高速缓存。
可以通过 WeakReference
来定义一个弱引用
WeakReference<> weak = new WeakReference<>(new User());//定义一个软引用指向堆内User对象 复制代码
弱引用也可与引用队列(ReferenceQueue)联合使用,在创建弱引用时,关联ReferenceQueue。如果弱引用引用的对象被回收时,Java虚拟机会把这个弱引用加入到与之关联的引用队列中。
ThreadLocal 中使用到了弱引用。
虚引用是最弱的引用,弱到,不能用弱引用访问到对象。
可以通过 PhantomReference
来定义一个虚引用。
虚引用,主要用来跟踪对象被垃圾回收器回收的活动。
虚引用必须与引用队列(ReferenceQueue)一起使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。我们可以根据引用是否在队列中,来判断对象的回收活动。
我们看出引用强度的不同,对象的生命周期不同,垃圾回收策略丰富,有利于更好的管理对象内存。
关键时理解: 一个对象,可以被多种类型引用同时指向,强度最高的决定他的生命周期 。
注意:这里的内存应该是指“ 堆内存 ”,并且区分 引用类型 与 基本类型
//String user ="user";// String user = new String("user"); SoftReference<String> softRef=new SoftReference<String>(user); WeakReference<String> weak = new WeakReference<String>(user); user=null; System.out.println(softRef.get()); System.gc(); System.out.println(weak.get()); 复制代码