2017-11-30 4 views
0

JVM 핫스팟에서 JVM은 젊은 생성 세대 및 뿌리를 표시 할 때 GC 유형 CMS 및 G1에 대한 구 세대 초기 마킹 구와 같은 일부 표시 문구에서 뮤 테이터 스레드 (STW)를 중지해야 함을 알고 있습니다.일부 표시 문구에서 GC가 뮤 테이터 스레드를 중지해야하는 이유는 무엇입니까?

이 문구 중에 왜 STW가 필요한지 알 수 있습니까? 뮤 테이터와 마크 스레드 간의 경쟁 조건을 피하려면?

우리는 STW를 방지하기 위해 동시 표시 문구와 동일한 기술을 사용합니까?

답변

0

CMS 수집기를 실행해야 할 때 루트 집합을 표시해야합니다. 이것은 현재 스택 프레임과 정적 참조에서 직접 액세스 할 수있는 객체 집합입니다. 이런 일이 발생하는 동안 뮤 테이터 스레드가 실행되도록 허용하면 스택 프레임이 팝되고 새 프레임이 푸시 될 때 참조가 누락 될 수 있습니다.

루트 집합을 표시 한 후 GC는 응용 프로그램 코드에서 참조 할 수있는 다른 모든 개체를 따라가는 정확한 시작점을가집니다. 이 부분은 뮤 테이터 스레드와 동시에 발생할 수 있습니다.

도달 가능한 개체의 전체 그래프가 추적되면 (동시에) 동시 마킹 단계가 진행되는 동안 변경된 사항을 유효한 개체 참조 목록에 통합 할 수 있도록 두 번째 STW remarking 단계가 필요합니다.

유효한 개체간에 사용 가능한 메모리 영역의 사용 가능한 목록을 업데이트하기 위해 동시 유효 스윕 단계를 사용할 수 있습니다 (모든 유효한 개체가 이제 알았으므로). 단편화가 너무 커지거나 여유 공간이 너무 작아지면 압축이 수행되지 않고 전체 압축 수집이 시작됩니다.

+0

"차고 수집 핸드북"과 CMS 논문 "세대 간 거의 동시 가비지 수집기"라는 책을 읽었을 때, 정말로 CMS에 대한 전체 프로세스를 알고 있습니다. 왜 루트 집합을 표시 할 때 STW를 피하기 위해 동시 마킹 구문과 동일한 기술을 사용할 수 있습니까? 스택 프레임이 팝되고 새로운 스택이 푸시 된 경우와 같이 쓰기 장벽이나 유사한 기술과 같은 기술을 사용하여 스택 프레임을 기록 할 수 있습니까? 우리는 루트 집합을 마킹하는 마지막 단계에서 다시 말을합니다. 적어도 우리는 전체 휴지기 시간을 짧게 할 수 있습니다. –

+0

예, 완전히 동시 GC를 허용하도록 알고리즘을 수정할 수 있습니다. 이것이 Azul의 C4 알고리즘이 수행하는 것이지만 핫스팟의 CMS 수집기와 다릅니다. 여기에서 기술 자료를 얻을 수 있습니다 : https://info.azul.com/2015-WEB-WP-C4-LP.html – Speakjava

관련 문제