弱い参照に関する私の理解: オブジェクトへのすべての強い参照が失われるか削除されるまで、オブジェクトは 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 に設定しているためであると考えられます。私が間違っている場合は、私を修正してください。