Zwalnianie pamięci

Aby uruchomić proces czyszczenia pamięci, należy usunąć wszystkie odwołania do obiektów.

Procesu czyszczenia pamięci nie można uruchomiać bezpośrednio w wersji wydania programu Flash Player. Aby mieć pewność, że obiekt zostanie usunięty przez proces czyszczenia pamięci, należy usunąć wszystkie odwołania do tego obiektu. Należy pamiętać o tym, że stary operator delete używany w języku ActionScript 1.0 i 2.0 zachowuje się inaczej w języku ActionScript 3.0. Może służyć wyłącznie do usuwania dynamicznych właściwości w dynamicznym obiekcie.

Uwaga: Proces czyszczenia pamięci można wywołać bezpośrednio w programie Adobe® AIR® oraz w wersji Flash Player z debugerem.

Przykład: poniższy kod ustawia odwołanie do obiektu Sprite na null :

var mySprite:Sprite = new Sprite(); 
 
// Set the reference to null, so that the garbage collector removes  
// it from memory 
mySprite = null;

Należy pamiętać o tym, że ustawienie obiektu na null , nie oznacza jego usunięcia z pamięci. W niektórych przypadkach proces czyszczenia pamięci nie jest uruchamiany, jeśli dostępna ilość pamięci nie zostanie uznana za dostatecznie małą. Czyszczenia pamięci nie można jednoznacznie przewidzieć. Proces przydzielania pamięci uruchamia czyszczenie pamięci, a nie usuwanie obiektów. Uruchomiony proces czyszczenia pamięci znajduje grafy obiektów, które nie zostały jeszcze usunięte. Wykrywa nieaktywne obiekty w grafach, znajdując obiekty, które odwołują się do siebie nawzajem, ale z których nie korzysta już aplikacja. Wykryte w ten sposób nieaktywne obiekty są usuwane.

W przypadku dużych aplikacji ten proces może powodować znaczne obciążenie procesora, wpływać na wydajność i powodować poważne spowolnienie aplikacji. W miarę możliwości należy ograniczać uruchamianie procesu czyszczenia pamięci poprzez ponowne wykorzystywanie obiektów. Ponadto w miarę możliwości należy ustawiać odwołania na null — dzięki temu proces czyszczenia pamięci poświęci mniej czasu wyszukiwaniu obiektów. Proces czyszczenia pamięci należy traktować tylko jako rodzaj zabezpieczenia i zawsze jawnie zarządzać cyklami życia obiektów.

Uwaga: Przypisanie odwołaniu do obiektu wyświetlanego wartości null nie gwarantuje wstrzymania tego obiektu. Obiekt nadal zużywa cykle procesora, dopóki nie zostanie usunięty przez proces czyszczenia pamięci. Należy zadbać o prawidłowe dezaktywowanie obiektu przed przypisaniem odwołaniu do niego wartości null .

Proces czyszczenia pamięci można uruchamiać za pomocą metody System.gc() , która jest dostępna w środowisku Adobe AIR oraz w wersji programu Flash Player z debugerem. Program profilujący dostępny w pakiecie z programem Adobe® Flash® Builder™ umożliwia ręczne uruchamianie procesu czyszczenia pamięci. Uruchomienie procesu czyszczenia pamięci umożliwia sprawdzenie, w jaki sposób reaguje na to aplikacja, oraz czy obiekty są poprawnie usuwane z pamięci.

Uwaga: Jeśli obiekt był używany jako detektor zdarzenia, inny obiekt może się do niego odwoływać. W takim przypadku detektory zdarzeń należy usunąć za pomocą metody removeEventListener() przed ustawieniem odwołań na null .

Na szczęście ilość pamięci używanej przez bitmapy można natychmiast zmniejszyć. Na przykład klasa BitmapData zawiera metodę dispose() . Poniżej przedstawiono przykład tworzenia instancji klasy BitmapData, która zajmuje 1,8 MB pamięci. Ilość aktualnie wykorzystywanej pamięci wzrasta do 1,8 MB, a właściwość System.totalMemory zwraca mniejszą wartość:

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 

Następnie obiekt BitmapData jest ręcznie usuwany (za pomocą metody dispose) z pamięci i ponownie sprawdzane jest aktualne wykorzystanie pamięci:

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 
 
image.dispose(); 
image = null; 
 
trace(System.totalMemory / 1024); 
// output: 43084 

Mimo że metoda dispose() usuwa piksele z pamięci, w celu całkowitego zwolnienia pamięci odwołanie musi być ustawione na null . Jeśli obiekt BitmapData nie jest już potrzebny, należy zawsze wywołać metodę dispose() i ustawić odwołanie na null — dzięki temu pamięć zostanie natychmiast zwolniona.

Uwaga: W programie Flash Player 10.1 i środowisku AIR 1.5.2 wprowadzono nową metodę o nazwie disposeXML() , która jest dostępna w klasie System. Ta metoda umożliwia natychmiastowe udostępnienie obiektu XML dla procesu czyszczenia pamięci, ponieważ przekazuje drzewo XML jako parametr.