2013-11-14 33 views
4

讓我先澄清這個問題不是什麼。這不是要求簡單解釋閃存管理或垃圾收集如何工作(引用計數,標記和掃描等)。它也不是一個避免內存泄漏的提示(例如回收渲染,弱引用,移除事件監聽器,IDispose模式,停止計時器,避免來自舞臺等全局對象的靜態指針和指針等)在Actionscript和MXML中編寫的Flex程序中調試內存泄漏的最佳方法是什麼?

假設你有在MXML和Actionscript中編碼的相當大的Flex程序,並且假定它由上述所有人都合理熟悉的人員編碼,並假定它仍然存在內存泄漏。在這一點上,有必要調試問題,問題是如何去做。

Flash Builder Premium IDE可以在時間A和時間B獲取內存快照,然後比較兩個快照,然後報告「遊蕩」對象。爲了使用它,一個程序運行到一個穩定狀態(時間A),然後運行一些(時間B),並且隱含的假設是系統應該包含大致相同的對象 - 如果它不是那麼新的是「遊蕩」(內存泄漏)。方便的是,IDE將提供一個指向每個遊蕩對象的指針列表。

但IDE似乎沒有提供關鍵的重要信息:哪些指針在內存中「鎖定」一個對象並阻止垃圾收集,哪些僅僅是應該去的子對象(循環)的指針如果收集到物體,則自然離開。雖然IDE確實將某些指針標記爲「gcroot」,但從子對象傳入的指針通常(通常爲!)標記爲gcroot,因此此標誌不提供必要的信息。由於合理大小的程序可以有很多對象,並且由於它們可以通過指針連接到一個複雜的圖形中,所以很難使用IDE來查找哪些指針導致內存泄漏。

因此,我的問題是,有沒有人有任何提示(超出上面已經提到的),如何找到在Actionscript和MXML中實現的Flex程序中的內存泄漏的原因?

+4

[偵察兵的Adobe(http://gaming.adobe.com/technologies/scout /)with'advanced-telemetry = true'應該可以幫助你,我想。只要確保你沒有設置爲true的生產版本;它會**減慢應用程序。 –

+0

我知道我已經多次使用SWF配置文件(FlashDevelop)來了解在給定特定時間的情況下代碼中活動的內容。當所有其他的失敗時,我通常會訴諸50%的代碼,看看它是否仍然發生,然後再繼續殺死50%,直到我發現問題:(從我的經驗來看,通常很難找到罪魁禍首在數據/輸出/調試,所以爲什麼我通常最終不得不採取務實的方式 –

+0

我通過首先通過FlashDevelop的分析器觀察類實例的計數來調試我的內存泄漏,並且如果我看到計數超出合理閾值,我下去創建/發佈這個特定的類並手動審查它。您可以使用受影響的類的靜態Vector來自動化其中的一部分,將所有創建的實例(手動)填充到其中,並且只要您要取消引用實例,將其從該向量中剪切出來並觀察它的增長或不。如果它不增長,請檢查您解除引用的某些對象是否還附加了事件偵聽器。 – Vesper

回答

0

看看The Miner

它有一個非常全面的工具集,可以從Flash播放器內部配置文件和調試。

我已經使用它來識別哪裏出現內存泄漏,並清理可能導致內存泄漏的事情。

+0

礦工看起來很死,不適用於在線應用程序,只有本地 – Delcasda

+0

TheMiner doesn不提供如何在MXML應用程序中運行的說明。 –

相關問題