Java の弱参照の理解と使用

(*-*)浩
リリース: 2019-11-28 13:16:37
オリジナル
2405 人が閲覧しました

Java の弱参照の理解と使用

Java では、オブジェクトが作成されると、そのオブジェクトはメモリ ヒープに配置されます。GC の実行時に、そのオブジェクトを指す参照が存在しないことが判明した場合、そのオブジェクトはメモリ領域を解放するためにリサイクルされます。

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

1) それを指す参照がありません (推奨学習: java コース )

2)GC が実行されます。

Java 単純な状況では、プログラマが手動で空白に設定する必要はありません。Java では、単純なオブジェクトの場合、それを呼び出すメソッドが実行されると、それを指す参照が GC によってリサイクルされるからです。

実際には、コードを記述するとき、次のように、特定のオブジェクトを指すすべての参照を null に設定することがよくあります。

Person p = new Person("张三",18,"男");//强引用
...
p=null;//不再使用的时候置null
ログイン後にコピー

明らかに、プログラマにとって、手動で null オブジェクトを設定するのは面倒です。自動リサイクルメカニズムに違反します。

メソッド内で生成されたローカル オブジェクトなどの単純な状況では、Java ではプログラマがそれらを手動で空にする必要はありません。Java を呼び出すメソッドが実行されると、それを指す参照が GC によってリサイクルされます。

キャッシュの使用など、より複雑な状況では、キャッシュ内のオブジェクトはまさにプログラムの実行に必要なものであるため、プログラムが実行されている限り、キャッシュ内の参照は GC されません。 GC でリサイクルできず、自動的にリサイクルできないオブジェクトが増えていますが、現時点では、開発者がリサイクルを処理する必要がありますが、これは明らかに Java の自動リサイクル メカニズムに違反します。

これに関連して、弱い参照 (WeakReference) が Java に導入されました。

オブジェクトが他の強参照がなく、弱参照によってのみ指されている場合、GC が実行されると、オブジェクトはリサイクルされます。強い参照が存在し、それに関連付けられている場合、オブジェクトはガベージ コレクション中に再利用されません。

WeakReference の構文:

WeakReference<T> weakReference = new WeakReference<T>(referent);
ログイン後にコピー

弱参照によって参照されるオブジェクトを取得したい場合は、まずそれがリサイクルされているかどうかを判断する必要があります:

weakReference.get();
ログイン後にコピー

If このメソッドが空の場合、weakReference が指すオブジェクトがリサイクルされたことを意味します。

以下は WeakReference の要点です:

パーソン クラス:

package com.yx.test.model;
 
/**
 * Person
 *
 * @author yx
 * @date 2019/11/26 16:28
 */
public class Person {
    private String name;
    private int age;
    private String sex;
 
    public Person() {
    }
 
    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getSex() {
        return sex;
    }
 
    public void setSex(String sex) {
        this.sex = sex;
    }
}
ログイン後にコピー

テスト クラス TestWeakReference:

package com.yx.test.reference;
 
import com.yx.test.model.Person;
 
import java.lang.ref.WeakReference;
 
/**
 * TestWeakReference
 *
 * @author yx
 * @date 2019/11/26 16:30
 */
public class TestWeakReference {
    public static void main(String[] args) {
        Person p = new Person("张三",18,"男");
        WeakReference<Person> weakPerson = new WeakReference<Person>(p);
        int i=0;
        while(true){
            if(weakPerson.get()!=null){
                i++;
                System.out.println("Object is alive for "+i+" loops - "+weakPerson);
            }else{
                System.out.println("Object has been collected.");
                break;
            }
        }
    }
}
ログイン後にコピー

実行結果:

p is alive for 1 loops - java.lang.ref.WeakReference@330bedb4
...
p is alive for 62331 loops - java.lang.ref.WeakReference@330bedb4
p is alive for 62332 loops - java.lang.ref.WeakReference@330bedb4
p has been collected.
ログイン後にコピー

while ループが数万回実行された後、p がリサイクルされていることがわかります。

プログラムを何度もテストして実行した結果、p リサイクル中のループ実行回数は不確実であることがわかりましたが、これは GC 動作の不確実性によって決まるため、これは容易に理解できます。

概要:

1. Java では、オブジェクトが弱参照によってのみ参照されている場合、GC が実行されると、オブジェクトはリサイクルされます。

2. 弱参照の特性の 1 つは、いつリサイクルされるかが不確実であることです。

以上がJava の弱参照の理解と使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート