Ruby Magic의 이전 에피소드에서 우리는 Garbage Collection(GC)이 필요한 이유와 일반적으로 어떻게 작동하는지에 대해 이야기했습니다. 이 게시물에서 우리는 이것이 Ruby에서 어떻게 구현되는지 좀 더 자세히 알아볼 것입니다.
다양한 Ruby 구현
Ruby에는 여러 가지 구현이 있습니다. 세 가지 인기 있는 것은 MRI(Matz's Ruby Interpreter), Rubinius 및 JRuby입니다. 다른 Ruby 구현은 다른 GC 방법을 사용합니다. 이 기사에서는 대부분의 Ruby 개발자가 사용하는 MRI에 중점을 둘 것입니다.
루비의 힙
컴퓨터에는 스택과 힙이라는 두 가지 유형의 메모리가 있습니다. 스택은 매우 빠르며 함수 호출 컨텍스트에 국한됩니다. 즉, 스택에 선언된 모든 변수는 함수가 완료되면 즉시 해제됩니다. 스택은 크기가 매우 제한되어 있으므로 예를 들어 이미지나 파일 데이터가 포함된 더 큰 개체를 저장할 수 없습니다.
이것은 Ruby 객체를 저장하는 데 적합하지 않습니다. 이러한 객체는 메서드 호출보다 오래 지속되는 경우가 많습니다. 또한 개체가 스택에 비해 너무 큰지 여부를 예측하는 것은 거의 불가능합니다.
따라서 Ruby는 다른 유형의 메모리인 힙을 사용합니다. 힙에서 프로그램은 일부 메모리를 요구할 수 있으며 해당 메모리로 완료되면 정리를 담당합니다. Ruby는 Ruby 객체를 저장하는 데 사용할 단일 메모리 슬래브를 요구하여 이를 사용합니다. 이것을 Ruby의 힙이라고 합니다.
스택 및 힙 요약 | |
---|---|
스택 메모리 | 매우 빠름 함수 호출이 끝나면 사용된 메모리가 자동으로 해제됩니다. 크기가 매우 제한됨 |
힙 메모리 | 스택보다 약간 느림 자동 정리 없음 크기는 컴퓨터의 사용 가능한 메모리에 의해서만 제한됩니다. |
따라서 Ruby 객체는 항상 Ruby의 힙에 할당됩니다. 40바이트보다 작은 경우 해당 내용을 개체에 직접 포함할 수 있습니다. 그렇지 않으면 객체는 Ruby 힙에 있는 별도의 메모리 세그먼트를 가리킵니다. 따라서 Ruby 객체는 메모리의 완전히 다른 두 위치에 저장되는 경우가 많습니다. Ruby의 힙이 가득 차면 새 객체에 사용되는 새 힙이 생성됩니다.
마크 및 스윕
MRI는 Mark and Sweep이라는 GC 알고리즘을 사용합니다. 이것은 먼저 표시 단계를 수행하여 작동합니다. 표시 단계에서 Garbage Collector는 현재 존재하는 모든 개체를 검색하고 정리할 수 있다고 생각하는 모든 개체에 표시된 플래그를 설정합니다.
표시 단계는 코드 실행을 중지합니다. 그 이유는 Garbage Collector가 존재하는 객체 간의 모든 관계를 이해해야 하기 때문입니다. 프로그램이 표시 프로세스 동안 실행되면 그 동안 상황이 변경될 수 있으며 Garbage Collector는 개체의 현재 상태가 무엇인지 확신하지 못합니다.
두 번째로 스윕 단계가 시작됩니다. 이것은 Ruby 1.9 이상에서 백그라운드에서 실행됩니다. Garbage Collector는 표시 단계에서 표시된 모든 개체를 조용히 해제합니다. 메모리는 스위프 후에만 다시 사용할 수 있습니다.
표시 단계는 코드 실행을 중지하므로 프로덕션에서 문제가 발생할 수 있습니다. 스윕 단계는 비교적 양성입니다.
표시 및 스윕 요약 | |
---|---|
표시 단계 | 기존 개체 검색 개체가 정리될 수 있는 경우 표시 플래그 설정 코드 실행 중지 |
스윕 단계 | 백그라운드에서 실행 표시된 개체 정리 스윕이 완료된 후 다시 사용 가능한 메모리 |
주요 및 부 GC 실행
Ruby 2.1+에서 Garbage Collector는 메이저 및 마이너 실행을 수행합니다. 어떤 객체가 새로운지 추적합니다. 개체가 몇 번의 GC 실행에서 살아남으면 오래된 것으로 표시됩니다. 그런 다음 이전 개체는 사소한 실행에서 무시됩니다. Garbage Collector는 방금 할당된 개체만 스캔하면 되므로 부 실행이 훨씬 덜 방해가 됩니다.
이것은 종종 메모리의 일부를 정리해서는 안 되기 때문에 유용합니다. Rails를 부팅하면 전체 Rails 프레임워크를 메모리에 로드합니다. 그것은 평생 동안 거기에 머물기 때문에 매번 이러한 모든 개체를 확인하는 것은 자원 낭비가 될 것입니다.
주 및 부 실행 | |
---|---|
주요 실행 | 덜 자주 실행 더 집중적으로 실행 |
사소한 실행 | 이전 개체 무시 더 자주 실행 덜 거슬리는 실행 |
더 깊이 들어가고 싶은 분들을 위해
우리는 Aman Gupta의 훌륭한 블로그에서 이에 대해 많은 것을 배웠습니다. 이 주제에 대해 더 자세히 알고 싶다면 확인하십시오.
다음 단계:실용적인 가비지 컬렉션 조정
측정할 수 있는 여러 메트릭과 Garbage Collector 작동 방식을 조정할 수 있는 구성 변경 사항이 있습니다. 이 GC 시리즈의 다음 기사에서는 이러한 측정항목 및 구성 매개변수에 대해 설명합니다.