一看就懂的Java對象四種引用方式總結

這應該是一道很常見的面試題,但是有些小夥伴也不一定能很好的說清楚Java對象四種引用方式,這邊文章總結Java四種引用方式,希望可以幫到有緣人,哈哈。

強引用StrongReference

這種方式是平時工作中應用最多的一種引用方式。其特點是隻要GC Root可達,就不會被回收,及時內存空間不足了,也只會拋出OOM的異常,並不會被回收。通常的用法就是Objec obj = new Object()

如果想中斷或者回收強引用對象,可以顯式地將引用賦值爲null,這樣的話JVM就會在合適的時間,進行垃圾回收。

軟引用SoftReference

和強引用不同的是,軟引用對象在內存中是可有可無的。軟引用在GC Root可達且內存充足的時候不會被回收掉,當GC Root可達且內存不足的時候就會被回收掉。

只要軟引用對象沒有被回收掉,就可以使用。

SoftReference<byte[]> softReference = new SoftReference<>(new byte[1024 * 1024]);
弱引用WeakReference

相信看過ThreadLocal源碼的小夥伴對着這種引用一定很熟悉吧。沒錯,ThreadLocal中的靜態內部類ThreadLocalMap裏面的entry是一個WeakReference的繼承類。

static class Entry extends WeakReference<ThreadLocal<?>> {
	/** The value associated with this ThreadLocal. */
	Object value;

	Entry(ThreadLocal<?> k, Object v) {
		super(k);
		value = v;
	}
}

只要發生了GC,弱引用對象就會被回收掉。

虛引用PhantomReference

虛引用的設計和上面三種引用有些不同,它並不影響GC,而是爲了在對象被GC時,能夠收到一個系統通知。

那它是怎麼被通知的呢?虛引用必須要配合ReferenceQueue,當GC準備回收一個對象,如果發現它還有虛引用,就會在回收之前,把這個虛引用加入到與之關聯的ReferenceQueue中。

Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<Object> phantomObj = new PhantomReference<Object>(obj , queue);
obj = null; //去除強引用
總結

一般來說強引用是平時開發中應用最多的,虛引用基本不怎麼用。而軟引用和弱引用的區別就是:軟引用在內存不足的時候進行回收,弱引用只要進行GC就會被直接回收掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章