17. typedef struct RVALUE {
union {
! struct {
! VALUE flags;
! struct RVALUE *next;
RVALUE !
!
!
} free;
struct RBasic basic;
struct RObject object;
! struct RClass klass;
слоты в куче - это RVALUE !
!
struct RFloat flonum;
struct RString string;
! struct RArray array;
union от всех возможных !
!
struct RRegexp regexp;
struct RHash hash;
системных типов ! struct RData data;
! struct RTypedData typeddata;
! struct RStruct rstruct;
тип определяется по флагам ! struct RBignum bignum;
! struct RFile file;
размер обычно 40 байт !
!
struct RNode node;
struct RMatch match;
! struct RRational rational;
! struct RComplex complex;
} as;
} RVALUE;
18. Корневые объекты
Главный тред и RubyVM
Машинный контекст: стек и регистры
Глобальные константы и переменные
в том числе из нативных гемов
Таблица классов
Generic ivars
Finalizers и at_exit
19. Корневой объект Корневой объект
Obj1 Obj2 Obj4
Obj3 Obj5
Obj7 Obj6
20. Корневой объект Корневой объект
Obj1 Obj2 Obj4
Obj3 Obj5
Obj7 Obj6
22. Mark & Sweep: mark
Корневой объект Корневой объект
Obj1 Obj2 Obj4
Obj3 Obj5
Obj7 Obj6
23. Mark & Sweep: mark
Корневой объект Корневой объект
Obj1 Obj2 Obj4
Obj3 Obj5
Obj7 Obj6
24. Mark & Sweep: sweep
Корневой объект Корневой объект
Obj1 Obj2 Obj4
Obj3
25. Виды ссылок
Из корневых объектов
Переменные класса
Переменные экземпляра
Содержимое контейнеров
Локальные переменные
26. Задачка
class A
def a &b; end;
def initialize
a(&:to_s)
end
end
def closure_method
A.new
end
closure_method
GC.start
puts ObjectSpace.each_object(A){}
что будет выведено на экран?
36. Правильный ответ
MRI кеширует результаты Symbol#to_proc
В замыкание proc может попасть сам объект
Объект и все, на что он ссылается - останется в памяти до
вытеснения из кеша
Это баг в ruby
На экран будет выведена единица
https://gist.github.com/4273437
37. Поиск утечек
Научиться воспроизводить
Понять что именно течет
Снять дамп
Понять почему течет
Дальше по желанию
38. Пример с рельсами
class LeakController < ApplicationController
def leak
($leak ||= []).push proc{ "some never-callback" }
render text: "ololo"
end
end
39. Понять что именно течет
class LeakController < ApplicationController
def leak
($leak ||= []).push proc{ "some never-callback" }
render text: "ololo"
end
def count
GC.start
render :json => HeapDump.count_objects([:ApplicationController] +
ApplicationController.subclasses.map{|c| c.name.to_sym})
end
def dump
fork { HeapDump.dump; exit }
render :text => "May be Dumped"
end
end