programing

"m1 = null; 실행 후 가비지 수집 대상 개체 수"

nasanasas 2020. 11. 14. 10:18
반응형

"m1 = null; 실행 후 가비지 수집 대상 개체 수" m2 = null;”?


실행 후 이해하기 헷갈 m1 = null; m2 = null;립니다. 가비지 수집 대상 개체는 몇 개입니까?

public class MyTest {
    MyTest m;

    void show() {
        System.out.println("Hello this is show method.");
    }

    public static void main(String args[]) {
        MyTest m1 = new MyTest();
        MyTest m2 = new MyTest();
        MyTest m3 = new MyTest();
        m1.m = m2;
        m2.m = m3;
        m3.m = m1;
        m1 = null;
        m2 = null;
        // Question here: How many objects will be eligible for garbage collection?
    }
}

제로.

객체 참조 다이어그램은 다음과 같습니다.

회보

참조가 원형임을 알 수 있습니다. 의 참조 객체를 활성 상태 mainm3유지합니다 m3. 차례로, m3keeps alive m1, m2GC에서 유지 됩니다.

로 설정 m3하면 각 null개체에 대해 순환 참조가 존재하더라도 세 개체 모두 한 번에 GC에 적합하게됩니다. GC는 모든 참조가 GC 적격 객체에서 오는지 파악하고 세 가지를 모두 수집 할 수있을만큼 똑똑합니다.


잠재적으로 3 개 모두. //마커 다음에는 변수가 참조되지 않으므로 옵티마이 저는이 시점에서 변수를 프레임에서 드롭 할 수있는 권한 내에 있습니다.


짜잔! GC 는 여기서 아무것도 수집하지 않습니다! 여기서 실제로 무슨 일이 일어나는지 봅시다. m1, m2m3세 개의 개체를 만들 때 MyTest개체는 아래와 같이 생성되었습니다 (예 : 개체 참조 ID가 410에서 시작됨).

m1    MyTest  (id=410)
    m    null
m2    MyTest  (id=412)
    m    null
m3    MyTest  (id=414)
    m    null

초기화 할 때

m1.m = m2;
m2.m = m3;
m3.m = m1;

이제 개체는 다음과 같습니다.

m1    MyTest  (id=410)
    m    MyTest  (id=412)
m2    MyTest  (id=412)
    m    MyTest  (id=414)
m3    MyTest  (id=414)
    m    MyTest  (id=410)
        m    MyTest  (id=412)
            m    MyTest  (id=414)
                m    MyTest  (id=410)
                    .
                    .
                    . (This is circular)

그러나 m1m2로 다시 초기화 null하면 객체는 다음과 같습니다.

m1    null
m2    null
m3    MyTest  (id=414)
    m    MyTest  (id=410)
        m    MyTest  (id=412)
            m    MyTest  (id=414)
                m    MyTest  (id=410)
                .
                .
                .

봐, m1하고 m2있는 null지금, 그러나 그들의 참조 아직 살아에 있습니다 m3!


그것들은 여전히 ​​당신이 거기에서 만드는 순환 참조를 통해 도달 할 수 있기 때문에 없음 m3

참고 URL : https://stackoverflow.com/questions/33258627/how-many-objects-will-be-eligible-for-garbage-collection-after-executing-m1-nul

반응형