Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
49 lines (36 sloc) 2.52 KB

Устройство

Generational. Два поколения. Minor и major heap. Ref list. Три типа сборки - minor + major slice, major, compaction. Gc не лазит за пределы heap'ов, использует тэги в заголовках блоков для определения структуры данных для обхода.

Тюнинг

Имеет смысл если профайлинг показывает что программа большую часть времени проводит в сборщике мусора. В качестве меры работы Gc можно использовать отношение promoted words к minor words (чем меньше, тем лучше).

  1. По-умолчанию (в ocaml <= 3.12.0) размер minor heap слишком маленький (для современных систем). Рекомендуется поэкспериментировать в сторону увеличения.
  2. Аналогично major heap increment (на сколько увеличивается major heap).
  3. Рантайм вызывает major gc основываясь на оценках кол-ва мусора в heap'е. Эта оценка регулируется параметром space_overhead.
  4. Compaction вызывается основываясь на max_overhead.

Cм. документацию на модуль Gc.

Огромные долгоживущие структурно-неизменяемые массивы данных при каждом цикле gc будут проверяться мусорщиком. Варианты решения :

  • уменьшить кол-во циклов gc (как описано выше)
  • убрать данные из ocaml heap (и освобождать память вручную, см. Ancient)
  • массивам явно не содержащим указателей (например int array) вручную поставить No_scan_tag (теоретический непроверенный на практике хак).

See also


2011-03-26 13:09