国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解JAVA 虛引用

詳解JAVA 虛引用

2020-08-18 00:30弗蘭克的貓 Java教程

這篇文章主要介紹了JAVA 虛引用的相關資料,幫助大家更好的理解和學習JAVA,感興趣的朋友可以了解下

定義

引用是使用PhantomReference創建的引用,虛引用也稱為幽靈引用或者幻影引用,是所有引用類型中最弱的一個。一個對象是否有虛引用的存在,完全不會對其生命周期構成影響,也無法通過虛引用獲得一個對象實例。

說明

虛引用,正如其名,對一個對象而言,這個引用形同虛設,有和沒有一樣。

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

當試圖通過虛引用的get()方法取得強引用時,總是會返回null,并且,虛引用必須和引用隊列一起使用。既然這么虛,那么它出現的意義何在??

別慌別慌,自然有它的用處。它的作用在于跟蹤垃圾回收過程,在對象被收集器回收時收到一個系統通知。 當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在垃圾回收后,將這個虛引用加入引用隊列,在其關聯的虛引用出隊前,不會徹底銷毀該對象。 所以可以通過檢查引用隊列中是否有相應的虛引用來判斷對象是否已經被回收了。

如果一個對象沒有強引用和軟引用,對于垃圾回收器而言便是可以被清除的,在清除之前,會調用其finalize方法,如果一個對象已經被調用過finalize方法但是還沒有被釋放,它就變成了一個虛可達對象。

與軟引用和弱引用不同,顯式使用虛引用可以阻止對象被清除,只有在程序中顯式或者隱式移除這個虛引用時,這個已經執行過finalize方法的對象才會被清除。想要顯式的移除虛引用的話,只需要將其從引用隊列中取出然后扔掉(置為null)即可。

同樣來看一個栗子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class PhantomReferenceTest {
 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");
  PhantomReference<TestClass> phantomReference = new PhantomReference<>(obj, QUEUE);
 
  // 該線程不斷讀取這個虛引用,并不斷往列表里插入數據,以促使系統早點進行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(phantomReference.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();
 
  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) 1024K->432K(3584K), 0.0113386 secs]
[GC (Allocation Failure) 1455K->520K(3584K), 0.0133610 secs]
[GC (Allocation Failure) 1544K->648K(3584K), 0.0008654 secs]
null
null
null
[GC (Allocation Failure) 1655K->973K(3584K), 0.0008111 secs]
null
...省略幾個null的輸出
[GC (Allocation Failure) 1980K->1997K(3584K), 0.0009289 secs]
[Full GC (Ergonomics) 1997K->1870K(3584K), 0.0048483 secs]
--- 弱引用對象被jvm回收了 ---- java.lang.ref.PhantomReference@74cbe23d
--- 回收對象 ---- null
null
...省略幾個null和幾次Full GC的輸出
[Full GC (Ergonomics) 2971K->2971K(3584K), 0.0024850 secs]
[Full GC (Allocation Failure) 2971K->2971K(3584K), 0.0022460 secs]
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at weakhashmap.PhantomReferenceTest.lambda$main$0(PhantomReferenceTest.java:20)
at weakhashmap.PhantomReferenceTest$$Lambda$1/2065951873.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)

因為設置的虛擬機堆大小比較小,所以創建一個100k的對象時直接進入了老年代,等到發生Full GC時才會被掃描然后回收。

適用場景

使用虛引用的目的就是為了得知對象被GC的時機,所以可以利用虛引用來進行銷毀前的一些操作,比如說資源釋放等。這個虛引用對于對象而言完全是無感知的,有沒有完全一樣,但是對于虛引用的使用者而言,就像是待觀察的對象的把脈線,可以通過它來觀察對象是否已經被回收,從而進行相應的處理。

事實上,虛引用有一個很重要的用途就是用來做堆外內存的釋放,DirectByteBuffer就是通過虛引用來實現堆外內存的釋放的。

小結

  • 虛引用是最弱的引用
  • 虛引用對對象而言是無感知的,對象有虛引用跟沒有是完全一樣的
  • 虛引用不會影響對象的生命周期
  • 虛引用可以用來做為對象是否存活的監控

以上就是詳解JAVA 虛引用的詳細內容,更多關于JAVA 虛引用的資料請關注服務器之家其它相關文章!

原文鏈接:https://cloud.tencent.com/developer/article/1361840

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久久91精品国产一区二区三区 | 国产伦精品一区二区三区四区视频 | 日本福利网站 | 一本久久综合亚洲鲁鲁五月天 | 中文字幕一区二区三区乱码图片 | 日韩在线观看成人 | 黄色av免费看 | 成人免费观看49www在线观看 | 久久久久久亚洲精品 | 中文字幕日韩欧美一区二区三区 | 亚洲精品成a人在线 | 国产免费一区二区 | 日韩看片| 国产精品久久久久久久久免费桃花 | 中文字幕亚洲一区二区va在线 | 中文字幕第七页 | 亚洲午夜激情 | 久久影院久久 | 国产精品1区 | 亚洲区在线| 精品无码三级在线观看视频 | 毛片av在线播放 | 亚洲三区在线观看 | 一区二区三区在线免费视频 | 亚洲国产精品成人 | 国产色婷婷| 理论影院 | 欧美精品成人一区二区三区四区 | 久久国产精品视频 | 999精品在线 | 群p在线观看 | 午夜夜 | 99re国产| 国产欧美综合视频 | 精品成人久久久 | 精品久久精品 | 国产精品久久99 | 久草在线新视觉 | 九九香蕉视频 | 久播播av| 毛片免费在线播放 |