1

弱い参照に関する私の理解: オブジェクトへのすべての強い参照が失われるか削除されるまで、オブジェクトは gc によって削除対象としてマークできません。つまり、ある時点で、オブジェクトが弱い参照によってのみ参照されるままになっている場合、そのオブジェクトはガベージ コレクションの対象となり、次に GC が実行されたときにオブジェクトに削除のマークが付けられます。

1.私の理解は正しいですか?

私の理解を検証するために、2 つのクラスを持つ次のプログラムを作成しました。

public class Customer {
    private String name;
    private String ssnId;
    private String phone;

    public Customer(String name, String ssnId, String phone) {
        this.name = name;
        this.phone = phone;
        this.ssnId = ssnId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSsnId() {
        return ssnId;
    }
    public void setSsnId(String ssnId) {
        this.ssnId = ssnId;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String toString()
    {
        return ssnId + name + phone; 
    }

}

public class TestClass {

    public static void main(String[] args) {
        Customer cust = new Customer("ABCD", "001 ", "Phone Number");
        WeakReference<Customer> weakcust = new WeakReference<Customer>(cust);
        int i = 0;
        while(true)
        {
            if(weakcust.get() != null)
            {
                i++;
                System.out.println(i + " " + weakcust.get());
            }
            else
            {
                System.err.println("Object's deleted");
                break;
            }
        }
    }
}

論理的には、このコードは顧客の情報を出力し続ける必要があります。

驚いたことに、cust 参照を null に設定していない場合でも、GC は cust が指すオブジェクトを削除していることに気付きました。そしてしばらくすると、プログラムは「オブジェクトが削除されました」と出力します</p>

2.どうしてこうなった?

これは、コンパイラがコードを最適化しており、コードで cust 参照が使用されなくなったため、コンパイラがそれ自体を null に設定しているためであると考えられます。私が間違っている場合は、私を修正してください。

4

2 に答える 2

0

問題は、強参照オブジェクト customer 自体が、weakcust (弱参照) 以外の誰も参照していないことです。そのため、ガベージ コレクションのマークが付けられます。顧客がガベージ コレクションされると、目に見える動作が得られます。
実際のアプリケーションでは、顧客はどこかで参照され、その参照が解除された場合にのみ、ガベージ コレクションが行われます。

于 2013-02-13T21:04:38.380 に答える
0

cust変数をweakcustに割り当てた後、変数にアクセスしていません。JVM の最適化は、もう必要がないように見えることに気付いたので、後で破棄することにしました。

の静的変数に変更するとclass Main、この動作が変わる可能性があります。

于 2013-02-13T21:08:49.243 に答える