2014-10-07 4 views
8

GC 뿌리에 대해 질문이 있습니다. GC 뿌리는 "라이브 스레드"라는 것을 읽었습니다. 그게 무슨 뜻 이죠? 저는 항상 각 스레드마다 자체 스택이 있고 스택의 로컬 변수가 스레드에 대한 GC 루트이고 지금은 혼란 스럽다는 인상을 받았습니다. 프레임 스택이나 네이티브 스택에없는 다른 유형의 객체 참조는 스레드 표현에 있습니까?GC 루트로 쓰레드

기타 젊은 세대 컬렉션은 GC 루트를 사용합니까, 아니면 주요 알고리즘에만 해당합니까?

감사

업데이트 : 좋아 죄송합니다, 그래서 간단하게하기 :이 짧은 기사를 읽었습니다 : yourkit.com/docs/java/help/gc_roots.jsp과 "스레드"옵션으로 거기 GC 루트, 정확하게 그 스레드가 GC 루트라는 것을 의미합니까? Thread GC 루트가 참조하는 객체는 스택에 의해 참조되지 않는 객체는 무엇입니까? 두 범주가 다른 이유는 무엇입니까?

+1

귀하의 질문에 혼란이 있습니다. 1) 물론 GC 스레드에 대해서만 라이브 스레드 카운트합니다. 2) "쓰레드 표현"이란 무엇입니까? 3) 정적 변수는 스택이 아닌 GC 루트입니다. 4) 모든 GC 변형은 GC 루트를 고려합니다. 그것들을 고려하는 것이 불가능합니다. –

+0

죄송합니다. 간단하게하기 위해 다음과 같은 짧은 글을 읽었습니다 : http://www.yourkit.com/docs/java/help/gc_roots.jsp 그리고 GC 루트로서 "Thread"옵션이 있습니다. 스레드가 GC 루트라는 것을 의미합니까? Thread GC 루트가 참조하는 객체는 스택에 의해 참조되지 않는 객체는 무엇입니까? 두 범주가 다른 이유는 무엇입니까? – alobodzk

+0

@MarkoTopolnik 정적 변수가 루트라고 생각하지 않습니다. 그렇지 않으면 클래스 로더가 언로드되지 않습니다. –

답변

3

GC 뿌리 중 하나는 "라이브 스레드"입니다. 그게 무슨 뜻 이죠?

라이브 스레드는 시작되었으며 아직 종료되지 않은 스레드입니다.

프레임 스택이나 기본 스택에없는 다른 유형의 객체 참조는 스레드 표현에 있습니까?

없음.

(라이브) 스레드가 GC 루트라고하면 모두의 스레드 스택 프레임 값을 의미합니다.GC에 루트

("프레임 스택 '과'기본 스택은"같은 일입니다.)

가 ... 무슨 일이 정확히 그 실을 의미 하는가 입니까?

이것은 스레드의 스택이 GC 루트이고 모든 스레드의 스택 프레임에있는 모든 활성 변수의 내용에 도달 할 수 있음을 의미합니다.

이 모든 것들은 사실상 똑같은 것을 말합니다..

+0

설명해 주셔서 감사합니다! – alobodzk

+0

나는 yourkit의 분류가 임의적이라고 생각하지 않습니다. 그들은 분명히 그 구별과 함께 * 무언가를 의미합니다. –

+0

프레임 스택은 해석 된 코드에 사용되며 기본 스택은 인터프리터와 JIT 컴파일 코드에서 사용됩니다. –

0

메소드가 객체를 종료 할 때 로컬 new'ed라는 자바 스레드 객체를 가진 메서드를 상상해보십시오 (참조가 범위를 벗어나 힙 할당 메모리가 GC에 적합 함). 같은 방법으로 스레드를 시작하면 현재 스레드 객체의 라이브 타임과 참조되는 모든 내용이 라이브 \ 실행중인 스레드의 수명에 연결됩니다. 쓰레드가 종료 될 때까지 실행중인 쓰레드에서 참조 된 메모리는 여전히 GC에 부적합하며 쓰레드는 GC 루트라고합니다.

스레드는 스택이나 힙을 통해 두 가지 방식으로 메모리를 할당 할 수 있습니다. 스택 저장은 GC'ed되지 않지만 현재 스택 프레임이 풀려 나면 재 확보됩니다. 힙 저장소는 일반적으로 코드에서 'new'를 사용할 때 할당됩니다 (새 저장소는 항상 힙 저장소에서 이탈 분석을 의미하지는 않습니다). 힙은 GC로 처리됩니다.

GC 루트에 대해 더 많이 배우는 좋은 방법은 실행중인 Java 응용 프로그램의 힙 덤프를 가져 와서 Visual VM 또는 Eclipse MAT에로드하는 것입니다. 여기에서 GC 루트를 검사 할 수 있어야합니다.

청년 세대 컬렉션은 GC 루트가있는 개체가 GC를 사용할 수 없다는 점에서 GC 뿌리를 사용하지만 주어진 알고리즘으로 말하면 더 좋을 것입니다.

0

JVM은 스레드를 분할하고 일부는 가비지 수집 전용으로 사용되며, 일부는 다른 내부 JVM 태스크 용으로, 일부는 실행 파일의 사용자 제공 부분을 실행합니다.

이 문맥에서 도달 가능한 의미는 사용자 실행 스레드가 도달 할 수 있음을 의미합니다. 여기에는 public static void main(String[] args)에서 실행되도록 바인딩 된 첫 번째 스레드와 해당 스레드에서 시작된 모든 스레드에서 도달 할 수 없거나 완료되는 스레드를 뺀 값이 포함됩니다.