ホームページ  >  記事  >  Java  >  Java における「弱い」参照とは何なのかを見てみましょう。

Java における「弱い」参照とは何なのかを見てみましょう。

coldplay.xixi
coldplay.xixi転載
2021-01-06 18:10:212494ブラウズ

Java 基本チュートリアル コラム紹介 Java の「弱い」名言

Java における「弱い」参照とは何なのかを見てみましょう。

推奨(無料): java 基本チュートリアル

Java でオブジェクト obj が作成されると、それはヒープ上に配置されます。 GC が実行され、obj を指す参照が存在しないことが判明すると、obj オブジェクトのヒープ メモリ領域が再利用されます。

#つまり、オブジェクトがリサイクルされるには、次の 2 つの条件を満たす必要があります。

(1) それを指す参照がない

(2) GCを実行します。

実際の開発では、次のように、オブジェクトを指すすべての参照を空にすることで、次回 GC が実行されるときにこのオブジェクトが確実にリサイクルされるようにすることができます。これは非常に面倒で、自動 GC リサイクルの原則に反します。単純な場合、プログラマーによる手動設定は必要ありません。Java では、単純なオブジェクトの場合、それを呼び出すメソッドが実行されると、それを指す参照がスタックからポップされるため、次の実行時にリサイクルされます。 GCの実行。

ただし、特別な例外があります。キャッシュを使用する場合、キャッシュ内のオブジェクトはまさにプログラムが実行する必要があるものであるため、プログラムが実行されている限り、キャッシュ内の参照は GC されません (言い換えれば、キャッシュ内 (参照のライフ サイクルはメイン プログラムと同じです) キャッシュ内の参照が増えるにつれて、GC でリサイクルできないオブジェクトや、自動的にリサイクルできないオブジェクトが増えます。これらのオブジェクトをリサイクルする必要がある場合、これらのオブジェクトのリサイクル作業はプログラマにのみ任せることができます。しかし、これはGC(リサイクルできるものは自動的にリサイクルする)の本質に反します。

つまり、弱い参照が Java に導入されました。

Object c = new Car();    
c=null;
オブジェクトが他の強参照がなく、弱参照によってのみ指されている場合、GC が実行されると、オブジェクトはリサイクルされます。

次はインターネットからの例です。最初にエンティティ クラスを定義します:

Object c = new Car(); //只要c还指向car object, car object就不会被回收 -->(强引用)
通常、WeakReference を使用する場合、クラスは WeakReference から継承するように定義され、他のいくつかの属性が定義されますこのクラスでは、他の属性は定義されていません:

public class Car {
    private double     price;
    private String    color;

    public Car(double price, String color)
    {
        this.price = price;
        this.color = color;
    }

    public double getPrice()
    {
        return price;
    }

    public String getColor()
    {
        return color;
    }

    public String toString()
    {
        return "This car is a " + this.color + " car, costs $" + price;
    }
}
main 関数が呼び出されます。もちろん、GC の効果をより明確に確認するには、仮想マシン パラメータ "-XX: PrintGCDetails" を設定します。

public class WeakReferenceCar extends WeakReference<Car>
{
    public WeakReferenceCar(Car car)
    {
        super(car);
    }
}
最後は実行結果です

public static void main(String[] args)
{
    Car car = new Car(2000.0, "red");
    WeakReferenceCar wrc = new WeakReferenceCar(car);
    wrc.setStr("111");
    int i = 0;
    while (true)
    {
        if (wrc.get() != null)
        {
            i++;
            System.out.println("WeakReferenceCar's Car is alive for " + i + ", loop - " + wrc);
        }
        else
        {
            System.out.println("WeakReferenceCar's Car has bean collected");
            break;
        }
    }
}
68454 サイクルの後、WeakReferenceCar に関連付けられたオブジェクト Car がリサイクルされていることがわかります。弱参照そのものではなく、wrc がリサイクルされます。

WeakReference の特性の 1 つは、いつリサイクルされるかが不確実であることです。これは、GC 操作の不確実性によって決定されるためです。したがって、一般に、弱参照によって参照されるオブジェクトは貴重であり、キャッシュされます。再構築が容易で、多くのメモリを消費するオブジェクト。

弱参照が指すオブジェクトがリサイクルされると、弱参照自体は実際には役に立たなくなります。Java は、これらを保存するための ReferenceQueue を提供します。リサイクルされたオブジェクトを指す参照。使用方法は、WeakReference.

を定義するときに、ReferenceQueue オブジェクトをパラメータとしてコンストラクターに渡すことです。

以上がJava における「弱い」参照とは何なのかを見てみましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。