Java基礎の引用に関する知識のまとめ

3689 ワード

一、引用の定義
JDK 1.2以前は、Javaの中の引用定義が伝統的である:referenceタイプのデータ記憶の数値が別のメモリの先頭アドレスである場合、このメモリは参照を表しているという。
二、問題
このようなオブジェクトを記述する場合:メモリ空間が十分であれば、メモリに保存でき、ゴミ収集後にメモリ空間が非常に緊張していれば、これらのオブジェクトを捨てることができる。この時の引用はあまりに狭く見える。したがって、JDK 1.2の後、Javaスタック引用の概念が拡張されました。
三、引用の分類
回収タイミング
強引用
Strong Reference
Object obj=new Object()に似ています。
強い引用が存在する限り、ゴミ収集器は参照対象を永遠に回収しません。
ソフト参照
Soft Reference
いくつかの説明はまだ役に立つが、必要なオブジェクトではない。
メモリオーバーフローの異常が発生する前に、これらのオブジェクトを回収範囲に入れて2回目の回収を行います。今回の回収で十分なメモリがないとメモリオーバーが発生します。
弱い引用
Weak Reference
必要でないオブジェクトの説明に使用します。強度はソフト参照より弱いです。弱い引用に関連する対象は次のゴミ収集が発生する前に生存するしかないです。
ゴミ収集器が作動すると、現在のメモリが十分かどうかにかかわらず、紙コップを回収し、関連のオブジェクトを弱引用します。
虚引用
Photom Reference
また、幽霊引用や幻影引用とも呼ばれ、最も弱い引用関係です。オブジェクトが虚参照の存在であるかどうかは、その生存時間に全く影響を与えず、虚引用によってオブジェクトのインスタンスを取得することもできない。
オブジェクトに虚引用関連のウェアーを設定する目的は、このオブジェクトが収集されたときにシステム通知を受信することです。
四、応用シーン
1.強引用
最もよく使われているのは、応用シーンが一番多く、everwhereです。
2.ソフト引用
ただOOMが発生する時、自発的に回収して、いくつかのメモリの制限の比較的に大きい応用内で応用して、OOMが発生することを免れます。
3.弱引用
young gcもfull gcも弱い引用の対象を回収します。対象を引用したい時、この対象は自分のライフサイクルを持っています。この対象のライフサイクルに介入したくない場合、弱い引用を使います。
4.虚引用
回収時には、虚引用は主に対象のゴミ回収器の回収活動を追跡するために使用されていることが検出されます。

五、ソースコード

package org.pdool.ref;
​
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<VeryBig> rq = new ReferenceQueue<VeryBig>();
​
    public static void checkQueue() {
        Reference<? extends VeryBig> ref = null;
        while ((ref = rq.poll()) != null) {
            //        ,    
            System.out.println("In queue: "    + ((VeryBigWeakReference) (ref)).id);
        }
    }
​
    public static void main(String args[]) {
        int size = 3;
        LinkedList<WeakReference<VeryBig>> weakList = new LinkedList<WeakReference<VeryBig>>();
        for (int i = 0; i < size; i++) {
            weakList.add(new VeryBigWeakReference(new VeryBig("Weak " + i), rq));
            System.out.println("Just created weak: " + weakList.getLast());
        }
​
        System.gc();
        try {
            //   6s,              
            Thread.currentThread().sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        checkQueue();
    }
}
​
class VeryBig {
    public String id;
    //     ,       
    byte[] b = new byte[2 * 1024];
​
    public VeryBig(String id) {
        this.id = id;
    }
​
    protected void finalize() {
        System.out.println("Finalizing VeryBig " + id);
    }
}
​
class VeryBigWeakReference extends WeakReference<VeryBig> {
    public String id;
​
    public VeryBigWeakReference(VeryBig big, ReferenceQueue<VeryBig> rq) {
        super(big, rq);
        this.id = big.id;
    }
​
    protected void finalize() {
        System.out.println("Finalizing VeryBigWeakReference " + id);
    }
}
六、まとめ
Javaはこんなに多くの引用を提供していますが、通常の業務開発では基本的に強い引用があれば大丈夫です。全体的に上の3つの引用は強い引用以外はメモリと関連しています。
以上、Javaの基礎に関する知識を引用してまとめた文章をここに紹介します。Javaの引用内容については、以前の文章を検索したり、下記の関連記事を引き続き閲覧してください。これからもよろしくお願いします。