2016-07-04 1 views
6

루비에서 메모리를 관리하는 방법. 예 : 실행 중에 C 프로그램을 사용하면 다음이 메모리 모델입니다. 이루비에서 메모리가 어떻게 처리되는지와 비슷합니다.루비의 메모리 모델

C: 
         __________________ 
         |    | 
         |  stack  | 
         |    | 
         ------------------ 
         |    | 
         | <Un Allocated| 
         |  space> | 
         ------------------ 
         |    | 
         |    | 
         |  Heap  | 
         |    | 
         |    | 
         __________________ 
         |    | 
         |  data  | 
         __________________ 
         |  text  | 
         __________________ 

Ruby: 

       ? 
+1

Ruby 프로그램에서 볼 수있는 것은 없습니다. 이 모든 것은 통역관에 의해 추상화됩니다. –

+0

@undur_gongor 어떤 개념 다이어그램이라도? – mrg

+2

"메모리"라고 표시된 단일 상자? –

답변

8

루비에는 "메모리"와 같은 것이 없습니다.

Class#allocate은 개체를 할당하고 해당 개체를 반환합니다. 이것이 프로그래머가 오브젝트 공간 서브 시스템에서 가질 수있는 전체 상호 작용 범위입니다.

해당 개체가 할당 된 방식, 할당 된 방식, 메모리의 동일한 위치에 있거나 이동할 때 아무 것도 지정되거나 관찰 할 수없는 경우. 예를 들어, MagLev에서 객체는 실제로 메모리에 할당되지 않고 디스크 나 다른 컴퓨터의 메모리에 할당 될 수 있습니다. JRuby, IronRuby, Opal, Cardinal, MacRuby 등은 메모리 관리를 제 3 자에게 "아웃소싱"하고 있습니다. 그대로는은 자신의 기억에 어떤 일이 일어나고 있는지조차 모릅니다.

Ruby 구현은 별도의 스택과 힙을 사용할 수 있으며 힙 할당 스택을 사용할 수 있습니다. 스택을 전혀 사용하지 않을 수도 있습니다 (예 : 추기경).

참고 : ObjectSpace 모듈을 사용하면 제한된 양의 내부 검사 및 객체 공간 반영이 가능합니다. 일반적으로 루비에서 무언가가 "불가능"하다고 말할 때, "반사를 사용하지 않는 한"항상 암시 적으로주의해야합니다. 그러나 심지어 ObjectSpace은 메모리 구성에 대한 정보가 누출되지 않습니다.

YARV에는 YARV에 대한 내부 구현 세부 정보를 제공하는 objspace 라이브러리와 GC 모듈도 있습니다. 그러나 이들은 YARV의 사적인 내부 구현 세부 사항이며 다른 구현에 존재하지 않을 수도 있으며 YARV 내에서도 예고없이 언제든지 변경 될 수 있습니다.

가비지 수집에 대해 아무 것도 쓰지 않았 음을 알 수 있습니다. 글쎄, 사실 Ruby는 객체가 참조되는 시점과 그렇지 않은 시점을 지정합니다. 무엇을 해야할지은 참조되지 않은 개체와 함께 말하지 않습니다. 구현시 참조되지 않은 객체가 사용하는 공간을 되찾기 위해 어느 정도까지는 의미가 있습니다 (예 : 이전 버전의 YARV는 참조되지 않은 Symbol을 다시 요청하지 않음). 그러나 필수이거나 지정되지 않았습니다. 그리고 모든 구현은 매우 다른 접근 방식을 사용합니다. 다시 말하면 JRuby, IronRuby, Opal, Cardinal, MacRuby, Topaz, MagLev 등은 그 문제를 기본 플랫폼에 "아웃소싱"하고, Rubinius는 Immix 수집기를 기반으로하는 세대 간 복사, 이동 추적 수집기를 사용하며 YARV는 간단한 표시 - 및 - 스윕 추적 수집기.