當前位置:首頁 » 編程語言 » java的軟引用

java的軟引用

發布時間: 2022-12-23 07:30:51

A. java四種引用,強軟弱虛 有大神在嗎

Java中四種引用的特點:

  1. 強引用(StrongReference)

當我們使用 new 這個關鍵字創建對象時創建出來的對象就是強引用(new出來對象為強引用) 如Object obj = new Object() 這個obj就是一個強引用了,如果一個對象具有強引用。垃圾回收器就不會回收有強引用的對象。如當jvm內存不足時,具備強引用的對象,虛擬機寧可會拋出OutOfMemoryError(內存空間不足),使程序終止,也不會靠垃圾回收器去回收該對象來解決內存。

2.軟引用(SoftReference)

如果一個對象只具有軟引用,那就類似於可有可物的生活用品。如果內存空間足夠,垃圾回收器就不會回收它,如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。

軟引用的作用:軟引用可用來實現內存敏感的高速緩存
軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

3.弱引用(WeakReference)

如果一個對象只具有弱引用,那就類似於可有可物的生活用品。弱引用與軟引用的區別在於:只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先順序很低的線程, 因此不一定會很快發現那些只具有弱引用的對象。
弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。

4.虛引用(PhantomReference)

「虛引用」顧名思義,就是形同虛設,和其他幾種引用都不同,虛引用並不會決定對象的生命周期。如果一個對象僅持有 虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。

虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收器准備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之 關聯的引用隊列中。

ReferenceQueue queue = new ReferenceQueue ();

//虛引用對象

PhantomReference pr = new PhantomReference (object, queue);

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

如果你還想深入了解的話給你推薦一個博文地址:

網頁鏈接

B. java有幾種對象引用

1.強引用(StrongReference)
強引用是java中最常見的一種引用方式,當一個程序創建一個對象,並把這個對象賦給一個引用變數,程序通過該引用變數操作實際的對象.當一個對象被一個或一個以上的引用變數所引用時,它處於可達狀態,不可能被系統垃圾回收機制回收。
2.軟引用(SoftReference)
軟引用需要通過SoftReference類來實現,當一個對象只有軟引用時,它有可能被垃圾回收機制回收。對於只有軟引用的對象而言,當系統內存空間足夠時,它不會被系統回收,程序也可使用該對象;當系統內存空間不足時,系統可能會回收它。軟引用通常用於對內存比較敏感的程序中。
3.弱引用(WeakReference)
弱引用通過WeakReference類實現,弱引用和軟引用很像,但弱引用的引用級別更低。對於只有弱引用的對象而言,當系統垃圾回收機制運行時,不管系統內存是否足夠,總會回收該對象所佔用的內存。當然,並不是說當一個對象只有弱引用時,它就會立即被回收——正如那些失去引用的對象一樣,必須等到系統垃圾回收機制運行時才會被回收。
4.虛引用(PhantomReference)
虛引用通過PhantomReference類實現,虛引用完全類似於沒有引用。虛引用對對象本身沒有太大影響,對象甚至感覺不到虛引用的存在。如果一個對象只有一個虛引用時,那麼它和沒有引用的效果大致相同。虛引用主要用於跟蹤對象被垃圾回收的狀態,虛引用不能單獨使用,虛引用必須和引用隊列聯合使用

C. Java中的強引用,軟引用,弱引用,虛引用有什麼用

強引用:
只要引用存在,垃圾回收器永遠不會回收
Object obj = new Object();
//可直接通過obj取得對應的對象 如obj.equels(new Object());
而這樣 obj對象對後面new Object的一個強引用,只有當obj這個引用被釋放之後,對象才會被釋放掉,這也是我們經常所用到的編碼形式。

軟引用:
非必須引用,內存溢出之前進行回收,可以通過以下代碼實現
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有時候會返回null
這時候sf是對obj的一個軟引用,通過sf.get()方法可以取到這個對象,當然,當這個對象被標記為需要回收的對象時,則返回null;
軟引用主要用戶實現類似緩存的功能,在內存足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。

弱引用:
第二次垃圾回收時回收,可以通過如下代碼實現
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有時候會返回null
wf.isEnQueued();//返回是否被垃圾回收器標記為即將回收的垃圾
弱引用是在第二次垃圾回收時回收,短時間內通過弱引用取對應的數據,可以取到,當執行過第二次垃圾回收時,將返回null。
弱引用主要用於監控對象是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。

虛引用:
垃圾回收時回收,無法通過引用取到對象值,可以通過如下代碼實現
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永遠返回null
pf.isEnQueued();//返回是否從內存中已經刪除
虛引用是每次垃圾回收的時候都會被回收,通過虛引用的get方法永遠獲取到的數據為null,因此也被成為幽靈引用。
虛引用主要用於檢測對象是否已經從內存中刪除。

D. Java中軟引用(SoftReference)是什麼

如果一個對象只具有軟引用,則內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。
軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收器回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

E. Java中的強引用,軟引用,弱引用,虛引用有什麼用

我自己也復習下概念。
強引用:就是普通引用。比如 A o1=new A(); A o2=o1;
強引用只有當所有對這個對象的所有引用(o1,o2)失效後,new A()的內存才會被回收。

殘影引用、弱引用、軟引用都用來引用隨時可能被回收的對象。類似o1,o2即使未失效也會回收。
區別是被回收器回收的激烈程度,由強到弱。

殘影引用是對象已經finalize或者執行完析構函數,只等內存馬上回收了,最容易被回收。非常接近回收時機,就像殘影會隨物體消失而消失,故名。
弱引用的對象是在正常情況下,回收器遇到就回收,是被積極回收的對象。
軟引用是僅在內存不夠時才回收,屬於消極回收。

F. 北大青鳥設計培訓:java編程引用類型分析

我們在使用java編程開發語言開發軟體的時候通常都會new對象,然後通過對對象的引用來實現不同的編程需求,而今天電腦培訓http://www.kmbdqn.cn/就一起來了解一下,java編程開發語言中都有哪些常見的引用方法。
1:虛引用1.1簡介:虛引用是所有引用中強度弱的,它完全類似於沒有引用,在java.reflact.PhantomReference類中實現。
虛引用對象本身沒有太大影響,對象甚至感覺不到虛引用的存在。
如果一個對象存在虛引用,那麼它和沒有引用的效果大致相同,虛引用無法引用任何堆中的對象作用:虛引用主要用於跟蹤對象被JVM垃圾回收的狀態,可以通過它來手機GC的行為。
可以通過檢查與虛引用關聯的引用隊列中是否已經包含指定的虛引用,從而了解虛引用鎖引用的對象是否被回收。
注意:虛引用無法單獨使用,虛引用必須和引用隊列(ReferenceQueue)聯合使用.被虛引用所引用對象被垃圾回收後,虛引用將被添加到引用隊列中。
2:弱引用簡介:弱引用和虛引用有點類似,不同之處在於虛引用鎖引用的對象生存期比虛引用長一點。
虛引用在java.reflact.WeakReference類實現。
在系統進行垃圾回收的時候,不管系統內存是否足夠,總是回收該對象所佔用的內存.但是弱引用的強度是要大於虛引用的3:軟引用簡介:軟引用比弱引用的強度高一點,它是通過java.reflact.SoftReference來實現。
對於軟引用來說,當系統內存空間足夠時,它不會被系統回收,程序中改對象的引用也是有效的。
而當系統的內存空間不夠時,系統將會回收它。
作用:軟引用是強引用好的替代,它一定程度上可以避免系統內存不足的異常,可以充分使用軟引用來解決內存緊張的問題。
4:強引用簡介:強引用很常見,在平時的程序中,我們新new一個對象,比如Objectobject=newObject();那麼這個object就是指向object對象的強引用。
強引用的特點就是:被引用的java對象絕對不會被垃圾回收機制回收,即使系統的內存非常緊張,即使java以後也用不到,jvm不會回收強引用所引用的java對象。

G. Java引用分為強引用、軟引用、弱引用、虛引用,怎麼判斷出一個對象是哪個引用

根據new的方式。強引用就是 new 你定義的類名。
其餘的引用,都需要包裝類來創建。例如:new 軟引用(你定義的類)

H. 強引用/軟引用/弱引用/虛引用解析和應用場景分析

我們平常普通寫的 Object a=new object(); 創建對象就是一種強引用
當內存不足,JVM開始垃圾回收, 對於強引用的對象,就算是出現了OOM也不會對該對象進行回收
強引用是我們最常見的普通對象引用,只要還有強引用指向一個對象,就能表明對象還「活著」,垃圾收集器不會碰這種對象。在Java中最常見的就是強引用,把一個對象賦給一個引用變數,這個引用變數就是一個強引用。當一個對象被強引用變數引用時,它處於可達狀態,它是不可能被垃圾回收機制回收的, 即使該對象以後永遠都不會被用到JVM也不會回收。 因此強引用是造成Java內存泄漏的主要原因之一。
對於一個普通的對象,如果沒有其他的引用關系,只要超過了引用的作用域或者顯式地將相應(強)引用賦值為null,一般認為就是可以被垃圾收集的了(當然具體回收時機還是要看垃圾收集策略)。

SoftReference<Object> softReference=new SoftReference<>(o1);
軟引用是一種相對強引用弱化了一些的引用,需要用java.lang.ref.SoftReference類來實現,可以讓對象豁免一些垃圾收集。

對於只有軟引用的對象來說,
當系統內存充足時它不會被回收
當系統內存不足時它會被回收。

軟引用通常用在對內存敏感的程序中,比如高速緩存就有用到軟引用, 內存夠用的時候就保留,不夠用就回收!

弱引用需要用java.lang.ref.WeakReference類來實現,它比軟引用的生存期更短
對於 只有弱引用的對象 來說,只要垃圾回收機制一運行, 不管JVM的內存空間是否足夠,都會回收該對象佔用的內存。

軟引用/弱引用應用場景
場景模擬:
假如有一個應用需要讀取大量的本地圖片:
如果每次讀取圖片都從硬碟讀取則會嚴重影響性能,如果一次性全部載入到內存中又可能造成內存溢出。
此時使用軟引用可以解決這個問題。

弱引用之WeakHashMap
它是一個特殊的HashMap,屬於import java.util.WeakHashMap;與HashMap平級;
它的特殊之處在於當它的某個鍵值對中的鍵失效或者為NULL的時候.弱此時發生了GC,那麼該鍵值對將從WeakHashMap中移除;

注意若上述的key=Integer.valueOf(5),若這里key=null,不會讓map移除這個鍵值對,因為這里key指向的是一個值而不是一個引用,當map.put時候直接把值放進去了,所以key=null時候不會影響 WeakHashMap

下面要將虛引用,在此之前,我們需要先了解一個東西,ReferenceQueue
軟引用,弱引用,虛引用在創建時候可以直接傳一個對象其實他們還有另外有一個構造方法是傳一個對象和一個引用隊列,這樣會使他們回收之前保存到Reference里.

虛引用
虛引用需要java.lang.ref.PhantomReference類來實現。顧名思義,就是 形同虛設 ,與其他幾種引用都不同,虛引用並不會決定對象的生命周期。

如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收 ,它不能單獨使用也不能通過它訪問對象, 虛引用必須和引用隊列(ReferenceQueue)聯合使用。

虛引用的主要作用是 跟蹤對象被垃圾回收的狀態 。僅僅是提供了一種確保對象被finalize以後,做某些事情的機制。PhantomReference的get方法總是返回null,因此無法訪問對應的引用對象。 其意義在於說明一個對象已經進入finalization階段,可以被gc回收,用來實現比finalization機制更靈活的回收操作。
換句話說, 設置虛引用關聯的唯一目的,就是在這個對象被收集器回收的時候收到一個系統通知或者後續添加進一步的處理。
Java 技術允許使用finalize()方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。

四大引用和GCroot的雜糅

I. Java中弱引用和軟引用的區別以及虛引用和強引用介紹

Java中弱引用VS軟引用
Java中有如下四種類型的引用:
1.強引用(Strong Reference)
2.弱引用(WeakReference)
3.軟引用(SoftReference)
4.虛引用(PhantomReference)
強引用是我們在編程過程中使用的最簡單的引用,如代碼String s=」abc」中變數s就是字元串對象」abc」的一個強引用。任何被強引用指向的對象都不能被垃圾回收器回收,這些對象都是在程序中需要的。弱引用使用java.lang.ref.WeakReference class 類來表示,你可以使用如下代碼創建弱引用:

復制代碼代碼如下:

Counter counter = new Counter(); // strong reference - line 1
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection

現在只要你給強引用對象counter賦空值null,該對象就可以被垃圾回收器回收。因為該對象此時不再含有其他強引用,即使指向該對象的弱引用weakCounter也無法阻止垃圾回收器對該對象的回收。相反的,如果該對象含有軟引用,Counter對象不會立即被回收,除非JVM需要內存。Java中的軟引用使用java.lang.ref.SoftReference類來表示,你可以使用如下代碼創建軟引用:

復制代碼代碼如下:

Counter prime = new Counter(); // prime holds a strong reference – line 2
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2

prime = null; // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory

強引用置空之後,代碼的第二行為對象Counter創建了一個軟引用,該引用同樣不能阻止垃圾回收器回收對象,但是可以延遲回收,與弱引用中急切回收對象不同。鑒於軟引用和弱引用的這一區別,軟引用更適用於緩存機制,而弱引用更適用於存貯元數據。另一個使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map介面的另一種實現。WeakHashMap有一個特點:map中的鍵值(keys)都被封裝成弱引用,也就是說一旦強引用被刪除,WeakHashMap內部的弱引用就無法阻止該對象被垃圾回收器回收。
虛引用是java.lang.ref package包中第三種可用的引用,使用java.lang.ref.PhantomReference類來表示。擁有虛引用的對象可以在任何時候被垃圾回收器回收。和弱引用和軟引用相似,你可以通過如下代碼創建虛引用:

復制代碼代碼如下:

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference – line 3
PhantomReference phantom = new PhantomReference(digit); // phantom reference to object created at line 3

digit = null;

一旦移除強引用,第三行的DigitalCounter對象可以在任何時候被垃圾回收器回收。因為只有一個虛引用指向該對象,而虛引用無法阻止垃圾回收器回收對象。
除了了解弱引用、軟引用、虛引用和WeakHashMap,還需要了解ReferenceQueue。在創建任何弱引用、軟引用和虛引用的過程中你可以通過如下代碼提供引用隊列ReferenceQueue:

復制代碼代碼如下:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue);

引用實例被添加在引用隊列中,你可以再任何時候通過查詢引用隊列回收對象。一個對象的生命周期可以通過下圖進行描述:

這就是Java中弱引用和軟引用的區別。我們還學到了一些基本的引用類:弱引用、軟引用、虛引用以及WeakHashMap和WeakHashMap。總之,合理的使用引用可以幫助垃圾回收器更好的管理Java內存。

J. Java 關於強引用,軟引用,弱引用和虛引用的區別與用法

  1. 強引用:
    String str = 「abc」;
    list.add(str);

  2. 軟引用:
    如果弱引用對象回收完之後,內存還是報警,繼續回收軟引用對象

  3. 弱引用:
    如果虛引用對象回收完之後,內存還是報警,繼續回收弱引用對象

  4. 虛引用:
    虛擬機的內存不夠使用,開始報警,這時候垃圾回收機制開始執行System.gc(); String s = 「abc」;如果沒有對象回收了, 就回收沒虛引用的對象

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:506
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:13
linux485 發布:2025-07-05 14:38:28 瀏覽:295
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:745
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:418
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:667
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:228
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:669
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:271
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:821