Установить ссылки на нуль в объекте для GC'ed? - PullRequest
5 голосов
/ 21 марта 2011
// in a garbage collected VM, destroy someObject:
someObject.a = null;
someObject.b = null;
someObject = null;

Я слышал, что в хороших виртуальных машинах, таких как Java или C #, вы не должны этого делать.Установка someObject a и b на null замедлит сборку мусора, потому что сборщик мусора занимает больше времени, чтобы выяснить, что на ранее упомянутые объекты a и b больше не ссылаются, а есливы оставляете их нетронутыми, GC немедленно проверит их при очистке someObject.

Предполагая, что я слышал, что это правда (поправьте меня, если нет), то же самое для AVM2, виртуальной машины ActionScript 3 (особенно в последних версиях Flash Player)?

Причина, по которой я спрашиваю, состоит в том, что у меня есть коллега, который делает это так, потому что он узнал у предыдущего работодателя, что он быстрее, и что во Flash есть много подобных причуд (в которые, как мне кажется, легко поверить).

Мне просто интересно, актуальна ли эта информация (также для других оптимизаций Flash).По моему опыту, подобные приемы оптимизации довольно быстро устаревают на живой платформе.

1 Ответ

2 голосов
/ 21 марта 2011

Я не могу предоставить вам какие-либо конкретные, точные данные, для которых быстрее - установка на ноль или нет.Я, честно говоря, не верю, что кто-то будет.

Лучшее, что я могу сделать, - это предоставить вам некоторую информацию о сборе мусора, и вы сможете принять решение оттуда.

Из Flash Player 9 в Flash Player 10 Adobe сделала несколько серьезных улучшений, особенно в области управления памятью.Было несколько ошибок памяти при загрузке внешнего SWF-файла, оставшихся без ссылок звуков и т. Д. Большинство из них были исправлены.

Грант Скиннер выделил методы, которые GC использует, чтобы определить, какие объекты должны быть удалены.Посмотрите эту превосходную презентацию (с некоторыми классными взаимодействиями) о том, как она работает http://gskinner.com/talks/resource-management/ (но учтите, что презентация посвящена FP9)

Как он утверждает, есть подсчет ссылок и Mark Sweeping.В конечном итоге GC в AS3 сводится к ссылкам.Если объект (не примитивный тип) имеет ссылку на него, он не будет удален, но если это не так, то есть нет доступа к нему, он будет помечен для удаления.НО вы не можете контролировать, когда на самом деле происходит удаление - может быть этот кадр, может быть следующий.

В конечном счете, «обнулять» каждую переменную / свойство (ссылочное или иное), по моему мнению, расточительно и очень неуправляемо.Может быть практичным для небольших вещей, но когда объекты становятся больше с сотнями переменных, вы не можете обнулить все из них последовательно.

В дальнейшем Flash Player оптимизирует ГХ только для правильного способа выполнения действий, а не наоборот.

...