Как использовать flash.sampler.getSamples для проверки сборки мусора - PullRequest
1 голос
/ 10 августа 2011

Я пытаюсь провести модульный тест управления памятью.До сих пор у меня есть полуработоспособное решение, использующее flash.sampler.getSamples для получения разницы между числом NewObjectSamples и DeleteObjectSamples, которые имеют одинаковое значение идентификатора.

Тест выглядит примерно так:

startSampling();
new Foo();
new Foo();
new Foo();
forceGC();
pauseSampling();
countAllocations(Foo); // returns 1, should return 0

Метод countAllocations () получает разницу между количеством NewObjectSamples и DeleteObjectSamples для определенного класса:

    public static function countAllocations(type:Class):int
    {
        var count:int = 0;
        var allocations:Dictionary = new Dictionary();
        for each (var sample:Sample in getSamples()) {
            if (sample is NewObjectSample) {
                var newObjectSample:NewObjectSample = sample as NewObjectSample;
                if ((newObjectSample.type == type) && (newObjectSample.object != null)) {
                    allocations[newObjectSample.id] = true;
                    count ++;
                }
            } 
            else if (sample is DeleteObjectSample) {
                var deleteObjectSample:DeleteObjectSample = sample as DeleteObjectSample;
                if (allocations[deleteObjectSample.id]) 
                    count --;
            }
        }
        return count;
    }

Метод forceGC () использует хакер LocalConnection для принудительного сбора мусора:

public static function forceGC():void {
        try {
            new LocalConnection().connect("bdebdd96-7bf8-407b-bec9-8336b2b0c329");
            new LocalConnection().connect("bdebdd96-7bf8-407b-bec9-8336b2b0c329");
        }
        catch (error:Error) {
        }
}

Пошаговое выполнение кода показывает, что:

NewObjectSample Foo id=1 (count = 1)
NewObjectSample Foo id=2 (count = 2)
NewObjectSample Foo id=3 (count = 3)
// NewObjectSamples related to the LocalConnection hack
DeleteObjectSample id=2 (count = 2)
DeleteObjectSample id=1 (count = 1)
// Where's wally #3??

Поскольку нет ссылок на Foo, я предполагаю, что все экземпляры собираются для сбора мусора, и мой код просто неверен из-за моего отсутствияпонимания того, как работает выборка.Я пытаюсь сделать это вместо того, чтобы использовать словарь со слабым ключом, потому что кажется, что это должно быть меньше взлома, но теперь я начинаю задаваться вопросом, стоит ли оно того.

1 Ответ

1 голос
/ 18 августа 2011

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

...