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

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

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

服務器之家 - 編程語言 - Java教程 - Java基礎|強引用、弱引用、軟引用、虛引用

Java基礎|強引用、弱引用、軟引用、虛引用

2020-12-02 23:28今日頭條一角錢技術 Java教程

在ThreadLocal源碼中,其中嵌套類ThreadLocalMap中的Entry繼承了WeakReferenc。Java中提供這四種引用類型主要有兩個目的:第一是可以讓程序員通過代碼的方式決定某些對象的生命周期;第二是有利于JVM進行垃圾回收。

Java基礎|強引用、弱引用、軟引用、虛引用

 前言

在ThreadLocal源碼中,其中嵌套類ThreadLocalMap中的Entry繼承了WeakReferenc。Java中提供這四種引用類型主要有兩個目的:第一是可以讓程序員通過代碼的方式決定某些對象的生命周期;第二是有利于JVM進行垃圾回收。

強引用(StrongReference)

強引用是使用最普遍的引用。如果一個對象具有強引用,那垃圾回收器絕不會回收它。如下:

Object o=new Object();   //  強引用 

當內存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足的問題。如果不使用時,要通過如下方式來弱化引用,如下:

o=null;     // 幫助垃圾收集器回收此對象 

顯式地設置o為null,或超出對象的生命周期范圍,則gc認為該對象不存在引用,這時就可以回收這個對象。具體什么時候收集這要取決于gc的算法。

舉例:

public void test(){ 

    Object o=new Object(); 

    // 省略其他操作 

在一個方法的內部有一個強引用,這個引用保存在棧中,而真正的引用內容(Object)保存在堆中。當這個方法運行完成后就會退出方法棧,則引用內容的引用不存在,這個Object會被回收。

但是如果這個o是全局變量時,就需要在不用這個對象時賦值為null,因為強引用不會被垃圾回收。

強引用在實際中又非常重要的用處,舉個ArrayList的實現源代碼:

private transient Object[] elementData; 

public void clear() { 

        modCount++; 

        // Let gc do its work 

        for (int i = 0; i < size; i++) 

            elementData[i] = null

        size = 0; 

在ArrayList類中定義了一個私有的變量elementData數組,在調用方法清空數組時可以看到為每個數組內容賦值為null。不同于elementData=null,強引用仍然存在,避免在后續調用 add()等方法添加元素時進行重新的內存分配。使用如clear()方法中釋放內存的方法對數組中存放的引用類型特別適用,這樣就可以及時釋放內存。

軟引用(SoftReference)

軟引用是用來描述一些有用但并不是必需的對象,在Java中用java.lang.ref.SoftReference類來表示。對于軟引用關聯著的對象,只有在內存不足的時候JVM才會回收該對象。因此,這一點可以很好地用來解決OOM的問題,并且這個特性很適合用來實現緩存:比如網頁緩存、圖片緩存等。

如果一個對象只具有軟引用,則內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。

String str=new String("abc");                                     // 強引用 

SoftReference<String> softRef=new SoftReference<String>(str);     // 軟引用 

當內存不足時,等價于:

if(JVM.內存不足()) { 

   str = null;  // 轉換為軟引用 

   System.gc(); // 垃圾回收器進行回收 

軟引用在實際中有重要的應用,例如瀏覽器的后退按鈕。按后退時,這個后退時顯示的網頁內容是重新進行請求還是從緩存中取出呢?這就要看具體的實現策略了。

  • 如果一個網頁在瀏覽結束時就進行內容的回收,則按后退查看前面瀏覽過的頁面時,需要重新構建
  • 如果將瀏覽過的網頁存儲到內存中會造成內存的大量浪費,甚至會造成內存溢出

這時候就可以使用軟引用

Browser prev = new Browser();               // 獲取頁面進行瀏覽 

SoftReference sr = new SoftReference(prev); // 瀏覽完畢后置為軟引用         

if(sr.get()!=null){  

    rev = (Browser) sr.get();           // 還沒有被回收器回收,直接獲取 

}else

    prev = new Browser();               // 由于內存吃緊,所以對軟引用的對象回收了 

    sr = new SoftReference(prev);       // 重新構建 

這樣就很好的解決了實際的問題。

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

弱引用(WeakReference)

弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。在java中,用java.lang.ref.WeakReference類來表示。

弱引用與軟引用的區別在于:只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由于垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。

String str=new String("abc");     

WeakReference<String> abcWeakRef = new WeakReference<String>(str); 

str=null

當垃圾回收器進行掃描回收時等價于:

str = null

System.gc(); 

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

下面的代碼會讓str再次變為一個強引用:

String  abc = abcWeakRef.get(); 

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

當你想引用一個對象,但是這個對象有自己的生命周期,你不想介入這個對象的生命周期,這時候你就是用弱引用。

這個引用不會在對象的垃圾回收判斷中產生任何附加的影響

package com.niuh; 

 

import java.lang.ref.Reference; 

import java.lang.ref.ReferenceQueue; 

import java.lang.ref.WeakReference; 

import java.util.LinkedList; 

 

public class ReferenceTest { 

 

    private static ReferenceQueue<NiuhBig> rq = new ReferenceQueue<NiuhBig>(); 

 

    public static void checkQueue() { 

        Reference<? extends NiuhBig> ref = null

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

            if (ref != null) { 

                System.out.println("In queue: "    + ((NiuhBigWeakReference) (ref)).id); 

            } 

        } 

    } 

 

    public static void main(String args[]) { 

        int size = 3; 

        LinkedList<WeakReference<NiuhBig>> weakList = new LinkedList<WeakReference<NiuhBig>>(); 

        for (int i = 0; i < size; i++) { 

            weakList.add(new NiuhBigWeakReference(new NiuhBig("Weak " + i), rq)); 

            System.out.println("Just created weak: " + weakList.getLast()); 

 

        } 

 

        System.gc(); 

        try { // 下面休息幾分鐘,讓上面的垃圾回收線程運行完成 

            Thread.currentThread().sleep(6000); 

        } catch (InterruptedException e) { 

            e.printStackTrace(); 

        } 

        checkQueue(); 

    } 

 

class NiuhBig { 

    public String id; 

    // 占用空間,讓線程進行回收 

    byte[] b = new byte[2 * 1024]; 

 

    public NiuhBig(String id) { 

        this.id = id; 

    } 

 

    protected void finalize() { 

        System.out.println("Finalizing NiuhBig " + id); 

    } 

 

class NiuhBigWeakReference extends WeakReference<NiuhBig> { 

    public String id; 

 

    public NiuhBigWeakReference(NiuhBig big, ReferenceQueue<NiuhBig> rq) { 

        super(big, rq); 

        this.id = big.id; 

    } 

 

    protected void finalize() { 

        System.out.println("Finalizing NiuhBigWeakReference " + id); 

    } 

最后的輸出結果為:

Just created weak: com.niuh.NiuhBigWeakReference@3d075dc0 

Just created weak: com.niuh.NiuhBigWeakReference@214c265e 

Just created weak: com.niuh.NiuhBigWeakReference@448139f0 

Finalizing NiuhBig Weak 2 

Finalizing NiuhBig Weak 1 

Finalizing NiuhBig Weak 0 

In queue: Weak 2 

In queue: Weak 1 

In queue: Weak 0 

虛引用(PhantomReference)

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

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

總結

Java 4種引用的級別由高到低依次為:

  • 強引用 > 軟引用 > 弱引用 > 虛引用

通過圖來看一下他們之間在垃圾回收時的區別:

Java基礎|強引用、弱引用、軟引用、虛引用

當垃圾回收器回收時,某些對象會被回收,某些不會被回收。垃圾回收器會從根對象Object來標記存活的對象,然后將某些不可達的對象和一些引用的對象進行回收,通過表格來說明一下,如下:

Java基礎|強引用、弱引用、軟引用、虛引用

在實際程序設計中一般很少使用弱引用與虛引用,使用軟引用的情況較多,這是因為軟引用可以加速JVM對垃圾內存的回收速度,可以維護系統的運行安全,防止內存溢出(OutOfMemory)等問題的產生。

PS:這里有一個技術交流群(QQ群號:1158819530),方便大家一起交流,持續學習,共同進步,有需要的可以加一下。

延伸 · 閱讀

精彩推薦
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
主站蜘蛛池模板: 国产二区视频 | 男人超碰 | 日韩av一级片 | 日本一区二区三区四区 | 97久久超碰 | www.国产精品| 久久精品国产亚洲 | 极品videossex中国妞hd | 动漫羞免费网站中文字幕 | 国产中文字幕在线观看 | 欧美精品一 | 国产精品成av人在线视午夜片 | 久久午夜综合久久 | 久久久精品综合 | 久久com| 欧美一区二区精品 | 国产精品一码二码三码在线 | 午夜伦理影院 | 九九热精品在线 | 欧美日本一区二区三区 | 日本一区二区在线视频 | 亚洲免费视频一区二区 | 老丁头电影在线观看 | 亚洲免费在线观看 | 亚洲网站免费 | 自拍偷拍在线视频 | 日本一区二区三区四区 | 久久久久国产精品免费免费搜索 | 福利在线小视频 | 色偷偷888欧美精品久久久 | 在线看一区| 色站综合 | 欧美日韩国产在线播放 | 久久国产精品一区二区三区 | 99精品国产一区二区三区 | 欧美激情一区 | av久久| 国产成人99久久亚洲综合精品 | 美欧一级片| 综合99| 久久精品国产欧美亚洲人人爽 |