日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java ref 应用类型_Java四种引用类型

發布時間:2023/12/2 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java ref 应用类型_Java四种引用类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java四種引用類型

在java中,類型就分為兩種,基本類型和引用類型或自定義類型。

引用類型又分為四種:

強引用 StrongReference

軟引用 SoftReference

若引用 WeakReference

虛引用 PhantomReference

劃分這些類型的目的是:是為了更靈活的管理對象的生命周期,讓垃圾器在最合適的時間適合回收對象,常見使用的場景是在緩存的實現,比如elasticsearch在載入數據到緩存時,可以選擇SoftReference作為緩存的生命周期,在對象池組件common-pool中也利用到SoftReference管理對象池的對象生命周期。雖然,我們在實際業務中很少有用到這些知識,但是很有必要了解到這些,去幫助我們去做些程序性能優化。

強引用

強引用就是直接引用對象比如下面這樣,我們在編寫程序時,用到的大多都是強引用

StringBuffer b1 = new StringBuffer("hello world");

強引用對象,當垃圾回收進行時,不會被回收,及時通過b1 = null;釋放引用,在資源充足時,也不會被垃圾回收立刻回收。如果內存吃緊,Java虛擬機會拋出OutOfMemoryError錯誤,使程序異常終止,不會靠隨意回收具有強引用的對象來解決內存不足的問題。

軟引用

SoftReference softReference = new SoftReference(new StringBuffer("hello world"));

System.gc();

System.out.print(softReference.get()); // 只有當內存吃緊時,發生gc后,會報Exception in thread "main" java.lang.NullPointerException,

軟引用的生命周期會比強引用弱點,在內存空間足夠時,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。

它也經常和ReferenceQueue配合使用,如果gc在回收掉引用對象后,會把保存引用對象的softReference送入隊列,這時可以通過下面這行代碼判斷是否被回收。

// 創建softReference并提供給注冊隊列

ReferenceQueue referenceQueue = new ReferenceQueue();

SoftReference softReference = new SoftReference(new StringBuffer("hello world"),referenceQueue);

// 判斷入隊列來判斷是否被回收,或直接判斷softReference.get() == null

softReference.get() == null || softReference.enqueue()

另外也可以手動清除這些保存引用對象的reference對象

Reference ref;

while ((ref = referenceQueue.poll()) != null) {

// poll出即清除,也不必手動清除,等待gc清除

}

使用案列:common-pool2的SoftReferenceObjectPool,用于實現一種可以隨著需要而增長的池對象管理,當gc時可以清除空閑的實例。

下面是common-pool2的部分代碼,具體可以參照其里面的SoftReferenceObjectPool類

@Override

public synchronized void addObject() throws Exception {

assertOpen();

if (factory == null) {

throw new IllegalStateException(

"Cannot add objects without a factory.");

}

T obj = factory.makeObject().getObject();

createCount++;

// Create and register with the queue

PooledSoftReference ref = new PooledSoftReference(

new SoftReference(obj, refQueue));

allReferences.add(ref);

boolean success = true;

if (!factory.validateObject(ref)) {

success = false;

} else {

factory.passivateObject(ref);

}

boolean shouldDestroy = !success;

if (success) {

idleReferences.add(ref);

notifyAll(); // numActive has changed

}

if (shouldDestroy) {

try {

destroy(ref);

} catch (Exception e) {

// ignored

}

}

@Override

public synchronized void returnObject(T obj) throws Exception {

boolean success = !isClosed();

final PooledSoftReference ref = findReference(obj);

if (ref == null) {

throw new IllegalStateException(

"Returned object not currently part of this pool");

}

if (factory != null) {

if (!factory.validateObject(ref)) {

success = false;

} else {

try {

factory.passivateObject(ref);

} catch (Exception e) {

success = false;

}

}

}

boolean shouldDestroy = !success;

numActive--;

if (success) {

// Deallocate and add to the idle instance pool

ref.deallocate();

idleReferences.add(ref);

}

notifyAll(); // numActive has changed

if (shouldDestroy && factory != null) {

try {

destroy(ref);

} catch (Exception e) {

// ignored

}

}

}

弱引用

WeakReference weakReference = new WeakReference(new StringBuffer("hello world"));

WeakReference weakReference2 = new WeakReference(new StringBuffer("hello world"));

System.out.print(weakReference.get()); // hello world

StringBuffer buffer = weakReference2.get();

System.gc();

System.out.print(weakReference.get()); // Exception in thread "main" java.lang.NullPointerException

System.out.print(weakReference2.get()); // hello world

弱引用會在發生gc時,沒有對象在去引用時會被立刻被回收,不管內存是否充裕。

使用案列:WeakHashMap

虛引用

ReferenceQueue stringBufferReferenceQueue = new ReferenceQueue();

PhantomReference phantomReference = new PhantomReference(new StringBuffer("hello world"), stringBufferReferenceQueue);

System.out.print(phantomReference.get());Exception in thread "main" java.lang.NullPointerException

虛引用,不顧是否被垃圾回收,都不可以拿到真正的引用對象。一般用法是

程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那么就可以在所引用的對象的內存被回收之前采取必要的行動。

具體Demo代碼請參照:ReferenceDemo

總結

以上是生活随笔為你收集整理的java ref 应用类型_Java四种引用类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。