2012-02-06 52 views
7


我正在開發一個使用XUL的Firefox附加組件,並且我想測量和剖析我的擴展內存使用情況。
我該怎麼做?並檢查哪個函數佔用的內存最多,以及我的擴展添加到firefox的內存使用量有多少?

如何測量Firefox附加內存使用情況

+0

不知道它是否可以幫助你...但是你可以在地址欄中輸入「about:memory」,但我不認爲它會像你希望的那樣精確。 – 2012-02-06 18:20:12

+0

about:內存根本沒有幫助,爲了理解那裏的內容,我需要學習如何使用firefox內存......這太多了。 – Yosi 2012-02-06 18:31:28

回答

6

您無法測量單個函數的影響,Firefox中的內存管理在此級別不起作用 - 它適用於隔離專區。如果您的擴展程序有自己的窗口,那麼您將能夠在about:memory?verbose(單擊「最小化內存使用率」,否則您可能會看到那些將被垃圾收集的對象)下看到此窗口的隔離區。如果您的擴展程序的代碼在瀏覽器窗口的上下文中運行,那麼您通常不幸運 - 您將無法將其與其他正在運行的腳本區分開來。這與XPCOM組件和JavaScript模塊一樣 - 它們都被加載到「[System Principal]」隔離區中。

但是,如何讓腳本與大隔間分離,您可以做些什麼:使用沙箱,沙箱始終會有自己的隔間。例如,在一個瀏覽器窗口,你會做這樣的事情:

Components.utils.import("resource://gre/modules/Services.jsm"); 
var mySandbox = Components.utils.Sandbox(window, 
        {sandboxName: "myExtension/browserScript.js"}); 
mySandbox.window = window; // Expose window variable to scripts in the sandbox 
Services.scriptloader.loadSubScript("chrome://myextension/content/browserScript.js", 
            mySandbox); 
mySandbox.init(); // Call function init() of the script in the sandbox 

結果,將about:memory?verbose下顯示一個名爲myExtension/browserScript.js隔間,你將能看到多少內存這個腳本(與對象一起它創建等)完全採用。需要注意的事項:

  • 沙箱中的腳本將無法訪問「外部」中的變量。你必須明確地將這些變量設置爲沙盒的屬性(就像我在例子中用window變量所做的那樣)。
  • 隔間並不便宜,並且在隔間之間傳遞物體也不便宜。因此,爲每個功能創建一個分區將是一個壞主意,因爲涉及到開銷。

文檔:SandboxServices.jsm

更新:火狐的13件事情發生了變化。例如this extension會向您顯示當前內存中的所有對象。離舒適還有很遠的距離,整個畫面也不是微不足道的 - 但它可以讓您在低於隔層的層面上更加細化。

+0

非常感謝,我的代碼在沙箱中運行,現在我需要的只是將名稱添加到我的沙盒中,然後我可以對其進行配置,謝謝! – Yosi 2012-02-07 07:34:26

+1

@Yosy:查看我的答案更新,現在您可以查看JavaScript對象的整個圖形。 – 2012-02-23 15:59:23

+0

感謝弗拉基米爾,感謝原來的答案,我優化了我的擴展中的內存使用情況,我將檢查此擴展:) – Yosi 2012-02-23 17:00:02

相關問題