强引用
强引用在对象不被使用时,并且也发生了gc,但是也不会被回收,直到发生oom
1 2 3 4 5 6 7 8 9 10
|
public static void strongRef() { Object strongObj = obj; obj = null; System.gc(); System.out.println(strongObj); } java.lang.Object@677327b6
|
软引用
软引用在即将发生OOM时,会对没有使用的对象回收。
1 2 3 4 5 6 7 8 9 10 11
|
public static void softRef() { Object softObj = new Object(); SoftReference softReference = new SoftReference(softObj); softObj = null; System.gc(); System.out.println(softReference.get()); } java.lang.Object@677327b6
|
弱引用
发生GC时,就会对没有使用的对象进行回收。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public static void weakRef() { Object weakObj = new Object(); WeakReference weakReference = new WeakReference(weakObj); weakObj = null; try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.gc();; System.out.println(weakReference.get()); } java.lang.Object@677327b6 null
|
虚引用
虚引用不管在使用时还是未使用时直接取值都会是null,但是对象未被使用时(=null)会将对象放入到queue中。如果对象还在使用,则不放入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public static void phantomRef() { Object o = new Object(); ReferenceQueue queue = new ReferenceQueue(); PhantomReference phantomReference = new PhantomReference(o, queue); o = null; System.gc(); System.out.println(phantomReference.get()); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(queue.poll()); } null java.lang.ref.PhantomReference@677327b6
|