반응형
"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?
}
}
제로.
객체 참조 다이어그램은 다음과 같습니다.
참조가 원형임을 알 수 있습니다. 의 참조 는 객체를 활성 상태 main
로 m3
유지합니다 m3
. 차례로, m3
keeps alive m1
, m2
GC에서 유지 됩니다.
로 설정 m3
하면 각 null
개체에 대해 순환 참조가 존재하더라도 세 개체 모두 한 번에 GC에 적합하게됩니다. GC는 모든 참조가 GC 적격 객체에서 오는지 파악하고 세 가지를 모두 수집 할 수있을만큼 똑똑합니다.
잠재적으로 3 개 모두. //
마커 다음에는 변수가 참조되지 않으므로 옵티마이 저는이 시점에서 변수를 프레임에서 드롭 할 수있는 권한 내에 있습니다.
짜잔! GC 는 여기서 아무것도 수집하지 않습니다! 여기서 실제로 무슨 일이 일어나는지 봅시다. m1
, m2
및 m3
의 세 개의 개체를 만들 때 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)
그러나 m1
및 m2
로 다시 초기화 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
반응형
'programing' 카테고리의 다른 글
iTerm2 : 비활성 창 디밍 중지 (0) | 2020.11.14 |
---|---|
Android 스튜디오가 소스 폴더를 인식하지 못함 (0) | 2020.11.14 |
Postman-변수가 대체 된 헤더 및 본문 데이터가있는 요청을 보는 방법 (0) | 2020.11.14 |
T-SQL에서 테이블 변수를 반복 할 수 있습니까? (0) | 2020.11.14 |
댓글이 통역 언어를 느리게합니까? (0) | 2020.11.14 |