세대 가비지 수집기는 본질적으로 캐시 친화적입니까?


38

일반적인 세대 가비지 수집기는 최근 할당 된 데이터를 별도의 메모리 영역에 유지합니다. 일반적인 프로그램에서는 많은 데이터가 수명이 짧으므로 어린 가비지 (작은 GC주기)를 자주 수집하고 오래된 가비지를 수집하는 것은 메모리 오버 헤드와 GC를 수행하는 데 소요되는 시간 사이의 좋은 절충안입니다.

직관적으로, 단일 지역 수집기와 비교하여 세대 가비지 수집기의 이점은 캐시에 대한 주 메모리의 대기 시간 비율이 증가함에 따라 증가해야합니다. 이는 젊은 지역의 데이터가 자주 액세스되고 한 곳에서 모두 유지되기 때문입니다. 실험 결과가이 직관을 뒷받침 해 줍니까?


질문에 적절한 태그에 대한 관련 메타 토론 .
Kaveh

답변:


19

다음은 세대 가비지 수집기의 캐시 영향에 대해 설명하는 몇 가지 논문입니다.

내가 수집 할 수있는 것의 주요 문제는 가비지 수집 시스템이 메모리의 공간을 상쇄하여 초기 수집을 피한다는 것입니다. 캐시 메모리에도 동일하게 적용됩니다. 제안한 바와 같이, 1 세대는 캐시에 저장 될 가능성이 높으므로 할당 및 수집은 주 메모리에있는 것보다 훨씬 빠르거나 디스크로 페이징됩니다. 주요 문제는 캐시 크기와 관련하여 1 세대의 크기입니다. 1 세대 이전에 캐시가 가득 차면 미스가 쌓이기 시작할 때 이러한 이점을 잃기 시작합니다.


10

모든 가비지 수집기에는 매우 까다로운 부분이 있으며, 일부 설명에서는 "전체 스캔"또는 "전체 수집"입니다. 주기적으로 무작위로 간헐적으로 모든 객체를 스캔해야합니다. 세대 별 수집기는 전체 검색을 연기하고 지속 시간을 최소화하는 것이 좋지만 여전히 필요합니다.

세대 컬렉터는 때때로 "간호사"공간이라고하는 것에 초점을 맞출 것이지만, 결국 "이전"세대 공간에서 수집해야하므로 메모리의 전체 스캔이 발생합니다.

이 전체 검색은 거의 모든 메모리 캐싱 / 가상화 체계가이 경우 성능 향상에서 크게 실패하거나 실패한다는 점에서 거의 모든 메모리 캐싱 및 (특히!) 가상화 체계와 호환되지 않습니다.

따라서이 질문에 대한 주요 대답은 전체 스캔이 얼마나 자주 트리거되는지, 그리고 그 결과가 발생했을 때의 영향과 허용 될 수있는 경우의 "나쁜"것입니다. 이것은 더 응용 프로그램 종속 속성 / 질문으로 귀결됩니다.

다시 말해, 수집기의 작동 중 "대부분"에 대해 캐시는 아마도 캐시를 도울 것입니다 (캐시와 "젊은"보육 공간은 일반적으로 겹칠 것입니다!), 주기적, 간헐적, 최종적, 불가피한, 무거움, "이전 세대"공간이 완전히 수집되고 캐시 "적중률"이 외부에있는 많은 오브젝트가 전체에 의해 꽉 찬 루프로 페치 될 때 성능이 "대규모"[저하] 급증 할 수도 있습니다. 스캔 / 수집주기. 다시 말해, 피할 수없는주기적인 불연속성 (통계 추정 / 평균 / 성능 경향 등이 오도되고 적용 할 수없는 경우)입니다.

현재 등장하는 것은 기본 메모리 관리 시스템 (캐싱 / 가상화)과 맞물 리도록 설계된 새로운 수집 시스템입니다. 별도의 메모리 수집, 캐싱 및 가상화 시스템을 완전히 분리하는 역사적 접근 방식은 세 가지 측면을 모두 결합 / 통합 / 어드레싱하는 접근 방식뿐만 아니라 수행되지 않는 것으로 보입니다.

Zhou와 Demsky의 캐시 인식 가비지 콜렉션을 참조하십시오 .


따라서 세대 별 GC가 비세 대형 (클래식)에 비해 캐시 친화적이라고 주장 할 있습니까?
Raphael

GC는 기존 아키텍처에서 까다로운 디자인의 일부로 캐시 및 가상 메모리와 통합 된 방식으로 설계되어야한다고 주장합니다. 그러나 대답을 넓히기 위해-예. 세대 수집가는 자주 사용되는 개체를 연속 메모리로 집계 / 통합 / 그룹화 합니다. 여전히 일부 캐시 이점이 있습니다).
vzn

1
GC 병합 및 캐싱 / 가상화 아키텍처의 다소 까다로운 측면은 이러한 아키텍처는 일반적으로 메모리 페이지의 내용에 신경 쓰지 않지만 GC 시스템에서는 필요하다는 것입니다. 다른 언어는 때때로 프로그래머에게 다른 GC 관련 기능을 약속하며 OS 수준에서 지원할 기능을 파악하기 어려울 수 있습니다. 가장 좋은 방법은 각 객체에 초기 필드가 OS에 의해 정의되어 있지만 OS가 알지 못하거나 신경 쓰지 않는 언어 별 데이터가 오는 구조에 대한 포인터를 포함해야한다고 말할 것입니다.
supercat 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.