引用的四种类型_软引用 package src.main.java.com.qqjx.thread; /** * 软引用 * 软引用是用来描述一些还有用但并非必须的对象。 * 对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。 * 如果这次回收还没有足够的内存,才会抛出内存溢出异常。 * -Xmx20M */ import java.lang.ref.SoftReference; public class T02_SoftReference { public static void main(String[] args) { //idea 配置最大最小堆大小为20MB SoftReference<byte[]> m = new SoftReference<>(new byte[1024*1024*10]); //m = null; //第一次能正常 获取 System.out.println(m.get()); //第一次不能正常回收 System.gc(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // 第二次能正常获取 System.out.println(m.get()); //再分配一个数组,heap将装不下,这时候系统会垃圾回收,先回收一次,如果不够,会把软引用干掉 byte[] b = new byte[1024*1024*15]; System.out.println(m.get()); } } //软引用非常适合缓存使用 [B@1b6d3586 [B@1b6d3586 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at src.main.java.com.qqjx.thread.T02_SoftReference.main(T02_SoftReference.java:36)