Ruby Memory Validator powinny móc aby to zrobić, ale nie jest za darmo.
Aman Gupta
patched Joe Damatos
memprof ale wydaje mi się, że jest to
work in progress i nigdy nie udało mi się go uruchomić na moim komputerze. Joe ma kilka naprawdę dobrych wiadomości na temat memprof i innych rzeczy o niskim poziomie na jego
blog.
Teraz nie jestem pewien, czy naprawdę mogą. Liczby całkowite są przechowywane jako Fixnum
, a Fixnum
nie jest zwykłym obiektem Ruby, tylko wygląda w ten sposób. Ruby używa sprytnie przyśpieszonej sztuczki z wartością object_id
, aby uczynić obiekty nieprzydatne wartościami Fixnum
. Liczba ta jest w rzeczywistości przechowywana w samym object_id
. Dlatego dwa różne pakiety Fixnum zawierające tę samą wartość mają ten sam numer object_id
.
>> x=5
=> 5
>> y=5
=> 5
>> x.object_id
=> 11
>> y.object_id
=> 11
>> z=4711
=> 4711
>> z.object_id
=> 9423
object_id
z Fixnum
jest rzeczywiście stworzony przez nieco przesuwa się w lewo, a następnie ustawiając najmniej znaczącego bitu.
5
jest 0b101
i object_id
dla 5
jest 11
i 11
binarnie jest 0b1011
.
4711
jest 0b0001001001100111
, przesunąć w lewo i ustawić bit i masz 0b0010010011001111
i to jest 9423, która dzieje się object_id
dla z
powyżej.
This behaviour to prawdopodobnie specyfikacja implementacji, ale nie znam implementacji Ruby, która nie obsługuje w ten sposób pakietu Fixnum.
W Rubim są jeszcze co najmniej trzy najbliższe obiekty, to jest false
, true
i nil
.
>> false.object_id
=> 0
>> true.object_id
=> 2
>> nil.object_id
=> 4
Dlaczego? Co próbujesz zrobić? – SLaks