国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

簡(jiǎn)述Java中的四種引用類型

瀏覽:2日期:2022-08-14 14:51:16
簡(jiǎn)介

從JDK1.2版本開始,把對(duì)象的引用分為四種級(jí)別,從而使程序能更加靈活的控制對(duì)象的生命周期。這四種級(jí)別由高到低依次為:強(qiáng)引用、軟引用、弱引用和虛引用,下面分別介紹下這四種引用。

強(qiáng)引用

強(qiáng)引用是最常用的引用類型,如下所示,new Object()會(huì)創(chuàng)建一個(gè)Object對(duì)象并存儲(chǔ)在堆上,變量object存儲(chǔ)對(duì)該對(duì)象的強(qiáng)引用。

Object object = new Object();

強(qiáng)引用不會(huì)被垃圾回收,所以要想回收該對(duì)象,則應(yīng)該將指向該對(duì)象的變量顯示設(shè)為null,這樣該對(duì)象就由強(qiáng)引用轉(zhuǎn)變?yōu)闊o引用了。

示例:

public class ReferenceDemo { public static void main(String[] args) throws IOException {//強(qiáng)引用不會(huì)被垃圾回收ReferenceDemo referenceDemo = new ReferenceDemo();//強(qiáng)引用轉(zhuǎn)變?yōu)闊o引用,無引用可被垃圾回收referenceDemo = null;//觸發(fā)垃圾回收System.gc();//阻塞主線程,等待垃圾回收線程執(zhí)行System.in.read(); } //對(duì)象被回收之前調(diào)用 @Override protected void finalize() throws Throwable {super.finalize();System.out.println('-----finalize-----'); }}軟引用

軟引用是使用SoftReference創(chuàng)建的,在內(nèi)存空間充足的情況下,軟引用不會(huì)被回收,而在內(nèi)存空間不足虛擬機(jī)拋出OutOfMemoryError之前,軟引用將會(huì)被回收。

示例:

public class ReferenceDemo { public static void main(String[] args) throws InterruptedException {//創(chuàng)建ReferenceDemo對(duì)象的軟引用SoftReference<ReferenceDemo> softReference = new SoftReference<>(new ReferenceDemo());//觸發(fā)垃圾回收System.gc();//阻塞主線程,等待垃圾回收線程執(zhí)行Thread.sleep(5000);//softReference.get()返回軟引用對(duì)象,如果對(duì)象已經(jīng)被垃圾回收,則返回nullSystem.out.println(softReference.get());//創(chuàng)建25M的字節(jié)數(shù)組byte[] bytes = new byte[1024 * 1024 * 25];//內(nèi)存已經(jīng)不足,阻塞主線程,等待垃圾回收線程執(zhí)行Thread.sleep(5000);//重新輸出軟引用對(duì)象System.out.println(softReference.get()); }}/* * 輸出結(jié)果: * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a * null */

注意:示例運(yùn)行前需要設(shè)置堆內(nèi)存大小為30M(-Xmx30m -Xms30m)。

用途:軟引用可以用于對(duì)內(nèi)存空間敏感的緩存,緩存的對(duì)象一直保存,直到內(nèi)存空間不足而被回收。

弱引用

弱引用是使用WeakReference創(chuàng)建的,在垃圾回收線程執(zhí)行過程中,只要找到了弱引用,不管內(nèi)存空間是否足夠,弱引用對(duì)象都將被回收。由于垃圾回收線程是一個(gè)優(yōu)先級(jí)很低的線程,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。

示例:

public class ReferenceDemo { public static void main(String[] args) throws InterruptedException {//創(chuàng)建ReferenceDemo的弱引用WeakReference<ReferenceDemo> weakReference = new WeakReference<>(new ReferenceDemo());//weakReference.get()返回弱引用對(duì)象,如果對(duì)象已經(jīng)被垃圾回收,則返回nullSystem.out.println(weakReference.get());//觸發(fā)垃圾回收System.gc();//阻塞主線程,等待垃圾回收線程執(zhí)行Thread.sleep(3000);//重新輸出弱引用對(duì)象System.out.println(weakReference.get()); }}/* * 輸出結(jié)果: * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a * null */

用途:弱引用也可以用于緩存,可以參考WeakHashMap類。

虛引用

虛引用是使用PhantomReference創(chuàng)建的,它是所以引用類型中最弱的。虛引用對(duì)象和沒有引用的對(duì)象相同,可以在任何時(shí)候被垃圾回收,并且虛引用必須要與引用隊(duì)列一起使用。

當(dāng)垃圾回收線程回收一個(gè)虛引用對(duì)象時(shí),它將在垃圾回收后銷毀該對(duì)象,并將PhantomReference添加到引用隊(duì)列中。

示例:

public class ReferenceDemo { public static void main(String[] args) throws InterruptedException {//創(chuàng)建引用隊(duì)列ReferenceQueue<Object> referenceQueue = new ReferenceQueue();//創(chuàng)建ReferenceDemo的虛引用PhantomReference<ReferenceDemo> phantomReference = new PhantomReference<>(new ReferenceDemo(), referenceQueue);//phantomReference.get()總是返回nullSystem.out.println('phantomReference.get():' + phantomReference.get());//輪詢此隊(duì)列,查看是否有可用的Reference對(duì)象,有則返回該對(duì)象,否則返回nullSystem.out.println('referenceQueue.poll():' + referenceQueue.poll());//觸發(fā)垃圾回收System.gc();//阻塞主線程,等待垃圾回收線程執(zhí)行Thread.sleep(3000);System.out.println('------垃圾回收之后------');System.out.println('phantomReference.get():' + phantomReference.get());System.out.println('referenceQueue.poll():' + referenceQueue.poll()); }}/* * 輸出結(jié)果: * phantomReference.get():null * referenceQueue.poll():null * ------垃圾回收之后------ * phantomReference.get():null * referenceQueue.poll():java.lang.ref.PhantomReference@76fb509a */

用途:虛引用可以用于精確的檢測(cè)對(duì)象何時(shí)從內(nèi)存中刪除,通過檢查引用隊(duì)列來判斷對(duì)象是否已經(jīng)被回收。

以上就是簡(jiǎn)述Java中的四種引用類型的詳細(xì)內(nèi)容,更多關(guān)于Java 引用類型的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 安西县| 西和县| 西贡区| 双城市| 腾冲县| 济南市| 平定县| 奈曼旗| 南安市| 含山县| 兴和县| 德令哈市| 若羌县| 深水埗区| 西乌珠穆沁旗| 沙坪坝区| 禹城市| 奎屯市| 巍山| 嘉定区| 前郭尔| 长子县| 诸暨市| 沙坪坝区| 隆昌县| 浮梁县| 左云县| 奇台县| 华阴市| 和田市| 弥勒县| 万宁市| 鸡东县| 阿坝| 礼泉县| 福清市| 岱山县| 桑植县| 建昌县| 万安县| 桃江县|