簡體   English   中英

Flash / as3中有哪些好的內存管理技術

[英]What are good memory management techniques in Flash/as3

所以我非常熟悉Java,C和C ++中的內存管理; 但是,在flash中有哪些構造用於內存管理? 我假設flash有一種像java這樣的虛擬機,我一直認為當它們設置為null時會收集垃圾。 我不確定這是否真的如此。 還有一種方法可以在Flash中強制進行垃圾回收嗎? 還有其他提示嗎?

謝謝

Flash字節碼由AVM(Actionscript虛擬機)運行。 一般而言(並且不是Java的專家或Flash Player的內部),我認為可以說AVM模型有點類似於JVM模型(源代碼被編譯為字節碼,由字節碼運行) VM;在AVM中,至少,其中一些被解釋,一些是在執行之前JIT編譯為本機代碼等)。

正如你所說,AVM是垃圾收集的,所以GC基本上為你管理內存分配和釋放。 當一個對象無法訪問時,它符合GC的條件(這並不意味着它立即被收集)。

有一種方法可以強制進行GC循環,只能在播放器的調試版本中使用,還有黑客,非官方和無證件,但你可以在google中找到一些關於它的鏈接(嘗試GC hack flash LocalConnection或其他東西) 。 強制GC幾乎總是一個壞主意。

我最近遇到過這篇博文,解釋了GC如何在某些deatil中工作,並引用了AVM C ++源代碼(該部分播放器是開源的,所以如果你有更深入的信息,你可以查看它“如此傾向於”。 http://jpauclair.net/2009/12/23/tamarin-part-iii-current-garbage-collector-in-flash-10-0/

在一個非常具體的說明中:使用EventListeners時,代碼中的內存泄漏會變得猖獗。 我在AS / Flex教程中看到的用於添加監聽器的最常見示例如下所示:

button.addEventListener(MouseEvent.CLICK, doSomething);

這很好用,但忽略了一個重點:強烈引用了監聽器。 這意味着當包含此按鈕的組件是GC'd時,偵聽器會持續並保持對該按鈕的引用,這意味着它也不會被收獲。

要緩解這種情況,您可以執行以下兩項操作之一:

button.addEventListener(MouseEvent.CLICK, doSomething, false, 0, true);

是Adobe對3個額外字段的描述。 請注意他們對強引用的看法:

強引用(默認值)可防止您的偵聽器被垃圾回收。 弱參考不會。

另一個選項是在代碼中創建析構函數,這樣當使用EventListeners的組件在被拆除之前刪除它們時:

button.removeEventListener(MouseEvent.CLICK, doSomething);

除了已經回答的內容之外,最好使用像Doob先生的Actionscript性能監視器這樣的庫來激活顯示當前的內存使用情況。 用於檢測和修復內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM