釋放記憶體

刪除物件的所有參考以確定會觸發記憶體回收。

您無法在 Flash Player 的發行版本直接啟動垃圾回收器。若要確定物件可進行記憶體回收,請刪除該物件的所有參考。請記住,ActionScript 1.0 和 2.0 中使用的舊 delete 運算子,在 ActionScript 3.0 中會有不同的行為模式。它只能用來刪除動態物件的動態屬性。

備註: 您可以在 Adobe® AIR® 和 Flash Player 的除錯版本中直接呼叫垃圾回收器。

例如,下列程式碼會將 Sprite 參考設定為 null

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

請記住將物件設定為 null 時,沒有必要從記憶體移除物件。如果可用的記憶體沒有不足,有時便不會執行垃圾回收器。記憶體回收無法預測。記憶體配置 (而非物件刪除) 會觸發記憶體回收。垃圾回收器執行時,它會尋找尚未收集的物件圖像。它會尋找彼此互相參考但應用程式不再使用的物件,以便偵測圖像中的非作用中物件。以此方式偵測到的非作用中物件會遭到刪除。

在大型的應用程式中,這個程序可能會消耗大量的 CPU,而且可能會影響效能,並讓應用程式很明顯地變慢。請盡可能重複使用物件,以試著限制記憶體回收傳遞。另外,請盡可能將參考設為 null,這樣垃圾回收器就可花費較少的處理時間來尋找物件。將記憶體回收視為一種保險,並且永遠盡可能明確管理物件的存留期間。

備註: 將顯示物件的參考設為 null,並無法確保物件為凍結。物件在被回收之前,仍會繼續耗用 CPU 週期。在將物件的參考設為 null 之前,請確定已停用該物件。

使用 System.gc() 方法可以啟動垃圾回收器,這個方法在 Adobe AIR 與 Flash Player 的除錯版本中都有提供。Adobe® Flash® Builder 隨附的設定工具,可讓您手動啟動垃圾回收器。執行垃圾回收器可讓您查看應用程式回應的方式,以及是否從記憶體正確地刪除物件。

備註: 如果將物件做為事件偵聽程式,另一個物件即可參考它。若是如此,請於將參考設為 null 之前,使用 removeEventListener() 方法移除事件偵聽程式。

幸運的是,點陣圖使用的記憶體量會立即降低。例如,BitmapData 類別包括 dispose() 方法。下一個範例會建立 1.8 MB 的 BitmapData 實體。目前使用中的記憶體成長至 1.8 MB,而且 System.totalMemory 屬性傳回較小的值:

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

接下來,會從記憶體手動移除 (丟棄) BitmapData,並再次檢查記憶體用量:

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 

雖然 dispose() 方法會從記憶體移除像素,但是仍然必須將參考設定為 null 以完全釋放它。當您不再需要 BitmapData 物件時,一定要呼叫 dispose() 方法並將參考設定為 null ,這樣就會立即釋放記憶體。

備註: Flash Player 10.1 和 AIR 1.5.2 在 System 類別中引進了名為 disposeXML() 的方法。此方法藉由以參數傳送 XML 樹狀結構,使 XML 物件立即可進行記憶體回收。