在JAVA中提供了4个级别的引用:强引用,软引用,若引用,虚引用。强引用就是程序中通常使用的引用类型,强引用的对象是可触及的,不会被回收。相对的,软引用,若引用和虚引用的对象是软可触及,弱可触及,虚可触及,在必定条件下均可以被回收的java
// 强引用 StringBuffer str = new StringBuffer("abc");
软引用是比强引用弱一点的引用类型,一个对象只有持有软引用,那么当堆空间不足时,就会被回收。因此软引用不会形成内存溢出。数组
import java.lang.ref.SoftReference; /** * Created by dingshuangkun on 2018/1/26. */ public class Main { public static class User{ private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public static void main(String[] args){ User user = new User("dingding",20); SoftReference<User> softReference = new SoftReference<>(user); user = null; System.out.println(softReference.get()); System.gc(); System.out.println("--------GC----------"); System.out.println(softReference.get()); byte[] b =new byte[1024*1024*10]; System.gc(); System.out.println("----------建立byte数组后再次GC----------"); System.out.println(softReference.get()); } }
发现即回收,在系统GC时,只要发现若引用,无论系统堆空间的使用状况如何,都会将对象进行回收。因为垃圾收集器的线程一般优先级很低,所以并不必定能很快的发现持有若引用对象,在这种状况下,若引用对象能够存在较长的时间。一旦一个弱引用对象被垃圾回收器回收,便会加入到一个注册引用队列中。ide
import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; /** * Created by dingshuangkun on 2018/1/26. */ public class Main { public static class User{ private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public static void main(String[] args){ User user = new User("dingding",20); WeakReference<User> weakReference = new WeakReference<User>(user); user = null; System.out.println(weakReference.get()); System.gc(); System.out.println("--------GC----------"); System.out.println(weakReference.get()); } }
运行结果this
User{name='dingding', age=20}
--------GC----------
nullspa
Process finished with exit code 0
线程
随时均可能被回收。下面就不介绍了code