AS3 Управление памятью при создании экземпляров расширенных классов - PullRequest
0 голосов
/ 16 мая 2010

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

Представьте, что у меня есть класс с именем BaseClass, и некоторые классы, расширяющие этот класс, такие как ClassA, ClassB и т. Д.

Я объявляю переменную:

myBaseClass:BaseClass = new ClassA();

Через некоторое время я использую его для создания нового объекта:

myBaseClass = new ClassB(); 

через некоторое время после

myBaseClass = new ClassC(); 

и то же самое происходит каждые x миллис, срабатывает таймер.

Есть ли здесь проблемы с памятью? Правильно ли удалены неиспользуемые экземпляры сборщиком мусора?

Спасибо!

Ответы [ 2 ]

1 голос
/ 16 мая 2010

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

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

0 голосов
/ 20 января 2012

Если myBaseClass является единственной сохраненной ссылкой на

новый ClassA ()

и вы назначаете что-то еще для myBaseClass

новый ClassB ()

тогда не будет никакой ссылки, указывающей на ClassA, и сборщик мусора должен найти его при запуске.

Однако, если вы передадите myBaseClass библиотеке или классу, который хранит собственную ссылку на этот объект, при переназначении myBaseClass все равно будет ссылка, указывающая на ClassA, и сборщик мусора не очистит его, создав память протечь. Обычно хорошо написанная библиотека предоставит вам способ удалить ссылку. например,

var child:Sprite = new Sprite()
// one reference to the new Sprite

stage.addChild(child); // assume stage stores reference
// two references to the new Sprite

/**
 * assume the following:
 *
 * child = null; 
 *
 * one reference would still remain in stage
 * garbage collector will not clean up the sprite
 */

stage.removeChild(child); // assume stage clears reference
// one reference left
child = null;
// no reference to the sprite, garbage collector will clean it up

Надеюсь, это немного прояснит ситуацию. По сути, вы хотите отслеживать, сколько ссылок на объект существует, если вы подозреваете, что это утечка памяти.

Я знаю, что у FlashDevelop есть профилировщик, который очень полезен для поиска этих ошибок. Кроме того, вам нужно знать, что при запуске сборщика мусора ... он освободит память и передаст шаблон пилы вашему профилировщику памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...