Профиль FB говорит "это корень gc", но это кажется неправильным?
Людям очень нравится инструмент профилирования Flash Builder. Но недавно у меня возникла проблема, когда я попытался найти утечку памяти. Вот упрощенный образец.
package
{
import flash.display.Sprite;
import flash.sampler.pauseSampling;
import flash.system.System;
import org.robotlegs.base.ContextBase;
import org.robotlegs.mvcs.Context;
public class MemoryLeak extends Sprite
{
public function MemoryLeak()
{
makeAndDrop();
}
public function makeAndDrop():void{
var _context : Context = new Context(this);
_context = null;
}
}
}
Это простой класс, который создает объект, а затем освобождает его. Когда я использую перспективу профиля, она показывает мне "живые объекты".Это ожидаемо, так как я знаю, что GC освободит объект только тогда, когда у него недостаточно памяти. Затем я делаю снимок, чтобы увидеть странную вещь: прежде чем расширить путь, это выглядит так:И мне интересен держатель объекта контекста, поэтому я его расширяю:Это так странно! Как видите, ничто не содержит ссылки на него. И это подразумевается как "GCRoot". Я знаю статьи о корне gc, и это довольно просто (я прочитал до 20 статей о стратегии GC, чтобы обеспечить мое понимание). Невозможно, чтобы контекст был корнем gc. И более того, это вовсе не "1 путь"! Я надеюсь, что это ошибка в профиле, но мне нужны некоторые объяснения. Поэтому, пожалуйста, забудьте о "почему бы не собрать вопрос". Я надеюсь, что кто-то скажет мне, почему инструмент профиля говорит "контекст - это корень gc". Это ошибка или что-то? PS: я использую flash builder 4.6 и flash debugger 11 sa.