Generational. Два поколения. Minor и major heap. Ref list. Три типа сборки - minor + major slice, major, compaction. Gc не лазит за пределы heap'ов, использует тэги в заголовках блоков для определения структуры данных для обхода.
Имеет смысл если профайлинг показывает что программа большую часть времени проводит в сборщике мусора. В качестве меры работы Gc можно использовать отношение promoted words к minor words (чем меньше, тем лучше).
По-умолчанию (в ocaml <= 3.12.0) размер minor heap слишком маленький (для современных систем). Рекомендуется поэкспериментировать в сторону увеличения.
Аналогично major heap increment (на сколько увеличивается major heap).
Рантайм вызывает major gc основываясь на оценках кол-ва мусора в heap'е. Эта оценка регулируется параметром space\_overhead.
Compaction вызывается основываясь на max\_overhead.
Cм. документацию на модуль Gc.
Огромные долгоживущие структурно-неизменяемые массивы данных при каждом цикле gc будут проверяться мусорщиком. Варианты решения :
уменьшить кол-во циклов gc (как описано выше)
убрать данные из ocaml heap (и освобождать память вручную, см. Ancient)
массивам явно не содержащим указателей (например int array) вручную поставить No\_scan\_tag (теоретический непроверенный на практике хак).
2011-03-26 13:09