2014-02-18 2 views
3

Ruby에서 메모리 할당이 어떻게 작동하는지 궁금합니다.객체 메모리 할당

루비에서는 클래스 정의를 열고 인스턴스 변수/메소드를 추가 할 수 있습니다. 이 경우 새 객체는 기존 인스턴스보다 많은 메모리를 필요로합니다. 인스턴스에 할당 된 메모리를 내부적으로 어떻게 추적합니까? m 일부 메모리를 할당 할 것입니다,이 시점에서

m = MyClass.new 
m.myMethod 

:

class MyClass 
    def myMethod 
     @a = 5 
    end 
end 

우리는 MyClass의 인스턴스를 생성 :

예를 들어, 우리는 다음과 같은 클래스 정의가 있습니다. 이제 클래스 정의를 열고 다른 인스턴스 변수 b을 추가합니다.

class MyClass 
    def mySecondMethod 
     @b = 5 
    end 
end 

이 새로운 방법 mySecondMethod 및 인스턴스 변수 b

는 기존 인스턴스 Myclassm에서도 사용할 수 있습니다.

인스턴스화 b를 초기화 mySecondMethod를 호출 :

m.mySecondMethod 

어떻게 루비는 내부적으로 메모리를 관리합니까? 예를 들어 m 메모리 덩어리를 다시 할당합니까 아니면 새로 할당 된 메모리에 대한 포인터를 유지합니까?

+0

'b'와 같은 인스턴스에서는 'mySecondMethod'를 사용할 수 없으며 'b'와 같은 인스턴스 클래스에서는 사용할 수 없습니다. –

+0

@ArupRakshit, 나는 당신이 무엇을 의미하는지 이해하지 못합니다, "b'와 같은 인스턴스들". 이거 바꿔 주시겠습니까? 고맙습니다. – d3vin

답변

7

답변은 실제 구현에 따라 다릅니다. 여기서 나는 당신이 약 MRI에 대해 묻고 있다고 가정합니다.

루비 개체는 heap에 할당됩니다. 객체 할당에 대해 이야기 할 때 stack의 개념은 없습니다.

힙은 페이지으로 나뉘며, 각각 16kb로 구성됩니다. 각 페이지는 고정 크기 슬롯에 새겨 져 있으며 Ruby 객체를 저장할 수 있습니다. 각 객체 (구조체 RVALUE)가 40 바이트를 차지하므로 페이지에 ~ 408 개의 객체를 저장할 수 있습니다.

이 모든 것은 VM에 의해 관리됩니다 (즉, YARV).소스

ruby heap layout : 귀하의 예를에 관한 http://timetobleed.com/garbage-collection-slides-from-la-ruby-conference/

은, 변수는 할당 된 MyClass 객체에 너무 m 실제로 , 객체에 참조를 누르고 있습니다.

는 C 구조체 내부 MyClass 백업 (RClass)는 #mySecondMethod 같은 사용자 정의 방법 및 그 물체가있는 인스턴스 변수의 이름 테이블에 대한 포인터를 테이블에 대한 포인터를 포함한다.

Object 클래스가 모든 개체의 기본 루트이므로 RObject으로 백업 된 각 개체는 내부적으로 pointer to the values of its instance variables을 포함합니다.

새로 정의 된 #mySecondMethod은 언어의 동적 특성과 메서드 조회가 런타임에 발생한다는 사실 때문에 사용할 수 있습니다.

+0

@JesseSielaff 사실, 수정했습니다. 감사합니다 :) – Agis

+0

@ Agis 당신의 대답은 아주 좋습니다. "이 모든 것이 VM (예 : YARV)에 의해 관리됩니다."와 관련된 하나의 쿼리가 있습니다. 이 진술. YARV 문서 (http://en.wikipedia.org/wiki/YARV)는 1.9 버전에서 Ruby의 일부로 추가되었음을 보여줍니다. 그래서 이전 버전의 ruby ​​루비 객체에 대해 heap memory가 관리되는 방법은 무엇입니까? – BSalunke

1

두 번째 추측이 정확합니다. Ruby 객체는 힙 메모리에 대한 포인터를 유지합니다.

참고는, 그러나,이 귀하의 예제에서, mySecondMethod 때문에 개체 m에 호출되지, 해당 인스턴스 @bm 초기화/설정되지 않은 변수입니다.

아마도 가장 도움이되는 것은 먼저 Ruby를 사용하고 클래스와 객체 관용구가 어떻게 작동하는지 이해하는 것입니다. 그런 다음 Ruby 가비지 수집기에 대한 this very good and recent article과 같은 리소스를 살펴 보도록 권합니다.

+0

링크를 제공해 주셔서 감사합니다. 나는 그것을 통과 할 것이다. 사실, 원래 질문에서 mySecondMethod를 호출하는 것을 잊었습니다. 질문을 수정하여 전화를 겁니다. –