자바 객체는 GC-에드이 여전히 강한 참조 및 weaked 참조하여 링크 된 때이다

zhuj9 :

여기에 예제가있다 :

import java.lang.ref.WeakReference;

public class WeakRefTest {
    public static void main(String[] args) {
        Object obj = new Object();
        WeakReference<Object> weakRef = new WeakReference<Object>(obj);
        int i = 0;
        while (true) {
            if (weakRef.get() != null) {
                i++;
                System.out.println("The object is alive for " + i + " loops - " + weakRef);
            } else {
                System.out.println("The object has been collected.");
                break;
            }
        }
    }
}

이 프로그램을 실행하는 경우, 우리는과 출력을 얻을 수 있습니다 "The object has been collected."객체가 GC-ED된다는 뜻 잠시 후.

그러나,라는 강한 참조 여전히 존재 "obj"객체에 링크는이 교정 할 수있는 방법? JVM을 찾을 수 있기 때문에 강한 도달 아니에요, 그래서 더 강한 참조 사용은 나중에이 없다?

Nicktar :

루프 리소스 사용 측면에서 매우 "핫"실행되기 때문에, JVM은 그것을 최적화하기를 원할 것입니다. 이렇게하면 실제로 강한 참조 루프를 입력 한 후 도달하고, 따라서 그것을 멀리 최적화 될 수 없다는 사실을 컴파일러를 가리킬 수 있습니다.

당신이 좋아하는 무언가를 추가 할 경우이 문제가 가능성이 변경됩니다 System.out.println(obj)루프 후. 컴파일러는 새로운 문이 실제로 도달 할 수없는 코드에 있음을 볼 수 있도록 ... 루프 조건을 조정할 (뭔가를해야 할 수도 있습니다 while (weakRef.get() != null))

추천

출처http://10.200.1.11:23101/article/api/json?id=431641&siteId=1