일시 중지 GC의 알고리즘은 무엇입니까?


12

자바를위한 일부 언어는 일시 중지 GC가 낮습니다.

이러한 GC는 전 세계를 일시 중지하지 않고도 대부분의 작업을 수행 할 수 있습니다. 스레드가 메모리를 수정할 때 메모리를 분석해야하기 때문에 프로세스가 시작될 때 사용할 수있는 데이터 또는 더 이상 완료 될 때가 아닌 가비지로 보이는 데이터가 발생하기 때문에 이는 매우 어려운 문제입니다. 참조는 메모리로 옮겨졌고 GC 가보고있는 곳에는 나타나지 않았습니다.

기본적으로 그 뒤에 알고리즘은 무엇입니까?

이 주제는 실제로 기술적 인 것이므로 연구 논문 또는 기술 기사 링크는 올바른 답변으로 간주됩니다.

답변:


16

기본적으로 그 뒤에 알고리즘은 무엇입니까?

기본적으로 마크와 스윕 알고리즘 으로 "그냥" 별개의 스레드에서 동시에 실행됩니다 .

그 주제에 관한 연구 논문은 다음과 같습니다.


5

내가 이해하는 한 Java G1 가비지 수집기는 소위 힙 영역 을 사용 하여 전 세계를 일시 중지하지 않습니다. 내가 보는 방식은 리전을 수행하는 GC에 의해 리전 중 하나가 잠겨있는 동안 다른 리전에서 메모리 할당이 수행된다는 것입니다.

다음은 Jeremy Manson의 설명입니다 .

원리는 간단합니다. 수집기는 힙을 고정 크기 영역으로 분할하고 해당 영역의 라이브 데이터를 추적합니다. 그것은 영역 내외부에 포인터 세트 ( "기억 된 세트")를 유지한다. GC가 필요한 것으로 판단되면, 적은 라이브 데이터를 가진 지역을 먼저 수집합니다 (따라서 "쓰레기 우선"). 종종 이것은 한 단계로 전체 영역을 수집하는 것을 의미 할 수 있습니다. 영역에 대한 포인터 수가 0이면 해당 영역의 표시 또는 스윕을 수행 할 필요가 없습니다 ...


5

IBM의 실시간 JVM은 Metronome 라는 가비지 콜렉터를 사용 하여 GC 활동을 개별 퀀텀으로 분할하고이를 애플리케이션 처리에 인터리브합니다. 따라서 기본적으로주기적이고 결정적이지 않은 GC 일시 중지 대신 GC가 병렬로 수행되는 동안 응용 프로그램이 약간 느리게 실행됩니다.

동적 조각 모음을 수행하고 실시간 요구 사항을 충족하는 또 다른 GC가 있지만 여기서 찾을 수있는 유일한 참조는 여기 (ACM 멤버 자격 필요)입니다.

흥미로운 동시 실시간 가비지 수집기는 없습니다 . 기존의 마크 앤 스윕 방식을 사용하지만 멀티 프로세서 시스템에서 사용하도록 설계되었으며 잠금없는 동시 멀티 스레딩을 지원합니다.


좋아요! ACM에 액세스 할 수 없습니다.이 기사는 정말 흥미로워 보입니다.
deadalnix

2

작동하는 이유는 Java에서는 GC 만 GC 참조를 포함 할 수있는 메모리를 비울 수 있기 때문입니다. 즉, 별도의 스레드에서 객체를 안전하게 읽을 수있는 한 스택에서 참조를 관찰하기 위해 프로그램을 일시 중지하기 만하면됩니다.

변이에 대해 GC에 변경 사항을 알리기 위해 복사 중 복사 형태를 구현하는 것이 좋습니다.


스레드에 의해 참조가 언제든지 업데이트 될 수 있다면 충분하지 않습니다.
deadalnix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.