Я пытаюсь провести модульный тест управления памятью.До сих пор у меня есть полуработоспособное решение, использующее 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, я предполагаю, что все экземпляры собираются для сбора мусора, и мой код просто неверен из-за моего отсутствияпонимания того, как работает выборка.Я пытаюсь сделать это вместо того, чтобы использовать словарь со слабым ключом, потому что кажется, что это должно быть меньше взлома, но теперь я начинаю задаваться вопросом, стоит ли оно того.