日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解JAVA 弱引用

瀏覽:71日期:2022-08-27 08:45:32

定義

弱引用是使用WeakReference創建的引用,弱引用也是用來描述非必需對象的,它是比軟引用更弱的引用類型。在發生GC時,只要發現弱引用,不管系統堆空間是否足夠,都會將對象進行回收。

說明

弱引用,從名字來看就很弱嘛,這種引用指向的對象,一旦在GC時被掃描到,就逃脫不了被回收的命運。

但是,弱引用指向的對象也并不一定就馬上會被回收,如果弱引用對象較大,直接進到了老年代,那么就可以茍且偷生到Full GC觸發前,所以弱引用對象也可能存在較長的一段時間。一旦一個弱引用對象被垃圾回收器回收,便會加入到一個引用隊列中(如果有的話)。

弱引用對應的類為WeakReference,舉個栗子:

String s = new String('Frank'); WeakReference<String> weakRef = new WeakReference<String>(s);s = null;

這里我們把s設置為null后,字符串對象便只有弱引用指向它。

弱可達

如果一個對象與GC Roots之間僅存在弱引用,則稱這個對象為弱可達(weakly reachable)對象。

注意

在垃圾回收器回收一個對象前,WeakReference類所提供的get方法會返回其引用對象的強引用,一旦垃圾回收器回收掉該對象之后,get方法將返回null。所以在獲取弱引用對象的代碼中,一定要判斷是否為null,以免出現NullPointerException異常導致應用崩潰。

下面的代碼會讓s再次持有對象的強引用:

s = weakRef.get();

如果在weakRef包裹的對象被回收前,用強引用關聯該對象,那這個對象又會變成強可達狀態。

來看一個簡單的栗子了解一下WeakReference引用的對象是何時被回收的:

public class WeakReferenceTest { private static final List<Object> TEST_DATA = new LinkedList<>(); private static final ReferenceQueue<TestClass> QUEUE = new ReferenceQueue<>(); public static void main(String[] args) { TestClass obj = new TestClass('Test'); WeakReference<TestClass> weakRef = new WeakReference<>(obj, QUEUE); //可以重新獲得OOMClass對象,并用一個強引用指向它 //oomObj = weakRef.get(); // 該線程不斷讀取這個弱引用,并不斷往列表里插入數據,以促使系統早點進行GC new Thread(() -> { while (true) { TEST_DATA.add(new byte[1024 * 100]); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } System.out.println(weakRef.get()); } }).start(); // 這個線程不斷讀取引用隊列,當弱引用指向的對象唄回收時,該引用就會被加入到引用隊列中 new Thread(() -> { while (true) { Reference<? extends TestClass> poll = QUEUE.poll(); if (poll != null) { System.out.println('--- 弱引用對象被jvm回收了 ---- ' + poll); System.out.println('--- 回收對象 ---- ' + poll.get()); } } }).start(); //將強引用指向空指針 那么此時只有一個弱引用指向TestClass對象 obj = null; try { Thread.currentThread().join(); } catch (InterruptedException e) { e.printStackTrace(); System.exit(1); } } static class TestClass { private String name; public TestClass(String name) { this.name = name; } @Override public String toString() { return 'TestClass - ' + name; } }}

設置一下虛擬機參數:

-verbose:gc -Xms4m -Xmx4m -Xmn2m

運行結果如下:

[GC (Allocation Failure) 1017K->464K(3584K), 0.0014345 secs][GC (Allocation Failure) 1483K->536K(3584K), 0.0017221 secs][GC (Allocation Failure) 1560K->648K(3584K), 0.0036572 secs]TestClass - TestTestClass - TestTestClass - Test[GC (Allocation Failure) 1621K->984K(3584K), 0.0011455 secs]--- 弱引用對象被jvm回收了 ---- java.lang.ref.WeakReference@51a947fe--- 回收對象 ---- nullnull...省略n個null和幾次GC信息[Full GC (Ergonomics) 2964K->2964K(3584K), 0.0025450 secs][Full GC (Allocation Failure) 2964K->2964K(3584K), 0.0021907 secs]java.lang.OutOfMemoryError: Java heap spaceDumping heap to java_pid6860.hprof ...Heap dump file created [3912229 bytes in 0.011 secs]Exception in thread 'Thread-0' java.lang.OutOfMemoryError: Java heap spaceat weakhashmap.WeakReferenceTest.lambda$main$0(WeakReferenceTest.java:22)at weakhashmap.WeakReferenceTest$$Lambda$1/764977973.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)

可以看到,其實弱引用也并不是一發生GC就被回收掉了。

應用場景

如果一個對象僅僅是偶爾使用,并且希望在使用時隨時就能獲取到,但又不想影響此對象的垃圾收集,那么你應該用 WeakReference 來引用該對象。

弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。

一般來說,很少直接使用WeakReference,而是使用WeakHashMap。在WeakHashMap中,內部有一個引用隊列,插入的元素會被包裹成WeakReference,并加入隊列中,用來做緩存再合適不過。

在Tomcat的緩存中,其實就用到了WeakHashMap:

public final class ConcurrentCache<K,V> { private final int size; private final Map<K,V> eden; private final Map<K,V> longterm; public ConcurrentCache(int size) { this.size = size; this.eden = new ConcurrentHashMap<>(size); this.longterm = new WeakHashMap<>(size); } public V get(K k) { // 先從eden中取 V v = this.eden.get(k); if (v == null) { // 如果取不到再從longterm中取 synchronized (longterm) { v = this.longterm.get(k); } // 如果取到則重新放到eden中 if (v != null) { this.eden.put(k, v); } } return v; } public void put(K k, V v) { if (this.eden.size() >= size) { // 如果eden中的元素數量大于指定容量,將所有元素放到longterm中 synchronized (longterm) { this.longterm.putAll(this.eden); } this.eden.clear(); } this.eden.put(k, v); }}

這里有eden和longterm的兩個map,如果對jvm堆了解的話,可以看出tomcat在這里是使用ConcurrentHashMap和WeakHashMap做了類似分代緩存的操作。

在put方法里,在插入鍵值對時,先檢查eden緩存的容量是否超出設定的大小。如果沒有則直接放入eden緩存,如果超了則鎖定longterm將eden中所有的鍵值對都放入longterm。再將eden清空并插入該鍵值對。

在get方法中,也是優先從eden中找對應的key,如果沒有則進入longterm緩存中查找,找到后就加入eden緩存并返回。

經過這樣的設計,相對常用的對象都能在eden緩存中找到,不常用(有可能被銷毀的對象)的則進入longterm緩存。而longterm的key的實際對象沒有其他引用指向它時,gc就會自動回收heap中該弱引用指向的實際對象,并將弱引用放入其引用隊列中。

弱引用與軟引用對比

弱引用與軟引用的區別在于:

只具有弱引用的對象擁有更短暫的生命周期。 被垃圾回收器回收的時機不一樣,在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。而被軟引用關聯的對象只有在內存不足時才會被回收。 弱引用不會影響GC,而軟引用會一定程度上對GC造成影響。

相似之處:都是用來描述非必需對象的。

那么什么時候用SoftReference,什么時候用WeakReference呢?

如果緩存的對象是比較大的對象,使用頻率相對較高的對象,那么使用SoftReference會更好,因為這樣能讓緩存對象有更長的生命周期。

如果緩存對象都是比較小的對象,使用頻率一般或者相對較低,那么使用WeakReference會更合適。

當然,如果實在不知道選哪個,一般而言,用作緩存時使用WeakHashMap都不會有太大問題。

小結

弱引用是比軟引用更弱的引用類型 弱引用不能延長對象的生命周期,一旦對象只剩下弱引用,它就隨時可能會被回收 可以通過弱引用獲取對象的強引用 弱引用適合用作緩存

以上就是詳解 JAVA 弱引用的詳細內容,更多關于java 弱引用的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜久久美女| 久久在线91| 日本美女一区| 免费视频一区二区三区在线观看| 欧美日韩1区2区3区| 亚洲女同中文字幕| 久久中文字幕av| 亚洲性色视频| 婷婷成人综合| 国产伦精品一区二区三区在线播放| 欧美伊人久久| 国产精品入口久久| 国产毛片一区二区三区 | 日韩欧美一区二区三区在线视频| 精品国产黄a∨片高清在线| 国产一区二区三区久久| 高清在线一区| 亚洲人成在线网站| 欧美国产小视频| 国产亚洲一区二区手机在线观看| 国产中文在线播放| 日本久久成人网| 亚洲综合精品四区| 日本91福利区| 精品三级国产| 久久中文字幕二区| 午夜亚洲福利在线老司机| 欧美资源在线| 91九色综合| 精品久久国产一区| 久久视频国产| 伊人www22综合色| 国产精品亚洲四区在线观看| 国产探花一区在线观看| 成人精品动漫一区二区三区| 国产99久久久国产精品成人免费| 国产美女精品| 国产日韩欧美一区二区三区在线观看 | 男女男精品视频网| 国产日韩精品视频一区二区三区| 久久天堂影院| 欧美日韩精品免费观看视欧美高清免费大片 | 日本成人在线网站| 国产一区二区三区四区五区传媒| 欧美一区二区三区高清视频| 亚洲伊人精品酒店| 韩日一区二区| 亚洲一区二区三区免费在线观看| 欧美日韩在线精品一区二区三区激情综合 | 天堂资源在线亚洲| 在线精品一区二区| 久久永久免费| 夜久久久久久| 欧美激情亚洲| 亚洲免费高清| 九九九精品视频| 欧美日韩视频一区二区三区| 国产精品日本一区二区三区在线 | 91精品美女| 免费久久精品| 国产不卡人人| 国产欧美日韩在线一区二区| 一区久久精品| 国产成人精品亚洲日本在线观看| 国产精品www994| 精品一区二区三区中文字幕视频| 国产在线成人| 国产调教精品| 伊人成人网在线看| 久久亚洲国产精品尤物| 日本少妇一区| 国产精品尤物| 久久亚洲影院| 国产成人精品亚洲日本在线观看| 日韩在线网址| 久久精品av| 久久只有精品| 亚洲精品在线国产| 99国产精品免费视频观看| 国产精品玖玖玖在线资源| 中文日韩欧美| 日韩中文影院| 欧美激情综合| 亚洲最大av| 欧美日韩国产高清电影| 久久国产精品色av免费看| 亚洲一区二区三区免费在线观看 | 国产精品日本一区二区三区在线 | 国产在线不卡| 精品视频一区二区三区四区五区| 在线观看亚洲精品福利片| 波多野结衣久久精品| 国产一卡不卡| 97久久亚洲| 99香蕉国产精品偷在线观看| 欧美精品不卡| 亚洲精品大全| 欧美日韩国产免费观看 | 国产精品自在| 日韩激情av在线| 丝袜国产日韩另类美女| 久久国产电影| 97国产成人高清在线观看| 国产精品免费99久久久| 日韩一区二区三免费高清在线观看 | 黄色网一区二区| 欧美日韩一区二区国产| 一本一道久久a久久| 国产亚洲欧洲| 亚洲二区三区不卡| 久久国产电影| 激情久久五月| 亚洲二区精品| 久久国产毛片| 国产综合色区在线观看| 久久久久久自在自线| 麻豆一区在线| 欧美激情福利| 人人精品久久| 日韩精品中文字幕一区二区| 亚洲一区二区三区高清| 免费观看久久av| 999久久久91| 成人在线网站| 免费一级片91| 亚洲精品第一| 久久99偷拍| 成人小电影网站| 亚洲欧美综合| 蜜臀久久久久久久| 久久国产三级| 久久久久97| 亚洲精华国产欧美| 99在线精品免费视频九九视| 成人在线视频中文字幕| 国产精品777777在线播放| 国产欧美日韩免费观看| 国产精品一区二区精品视频观看| 久久国产三级精品| 国产精品多人| 国产精品mm| 国内在线观看一区二区三区 | 中文字幕日韩亚洲| 久久国产精品亚洲77777| 在线亚洲一区| 综合在线一区| 国产欧美二区| 日韩黄色免费网站| 麻豆成人综合网| 日本欧美不卡| 免费久久99精品国产| 青草综合视频| 精品三级在线观看视频| 97精品国产| 欧美+日本+国产+在线a∨观看| 夜夜嗨网站十八久久| 婷婷综合福利| 欧美精品91| 日韩精品不卡一区二区| 亚洲国产日韩欧美在线| 中文字幕免费一区二区| 日韩精选在线| 国产探花一区在线观看| 麻豆91小视频| 久久九九电影| 日韩一区欧美二区| 国产欧美三级| 粉嫩av一区二区三区四区五区| 精品成人免费一区二区在线播放| 欧美精品黄色| 日本不卡一区二区| 久久亚洲资源中文字| 亚洲特级毛片| 日本一区二区三区视频在线看| 国产精品伊人| 日韩国产网站| 亚洲影视一区| 免费一级欧美片在线观看网站| 久久免费黄色| 日韩一区二区三区免费视频| 成人国产综合| 蜜桃免费网站一区二区三区| 老司机精品视频在线播放| 婷婷色综合网| 久久成人高清| 日韩制服丝袜先锋影音| 成人台湾亚洲精品一区二区| 久久xxxx| 日韩精品第一区| 日韩成人一级| 九一国产精品| 久久亚洲人体| 视频一区二区中文字幕| 精品99在线| 亚洲精品少妇| 久久蜜桃精品| 麻豆精品一区二区综合av| 国产免费成人| 久久精品一区二区国产| 免费日韩av片|