如何测量firefox附加内存的使用情况

时间:2012-02-06 18:17:13

标签: firefox memory firefox-addon profiling xul


我正在使用XUL开发一个firefox附加组件,我想测量和分析我的扩展内存使用情况。
我怎样才能做到这一点?并检查哪个函数占用的内存最多以及我的扩展程序向firefox添加了多少内存使用量?

1 个答案:

答案 0 :(得分: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

因此,名为myExtension/browserScript.js的隔离专区将显示在about:memory?verbose下,您将能够看到此脚本(以及它创建的对象等)的内存量是多少。要记住的事情:

  • 沙盒中的脚本无法访问“outside”中的变量。您必须将这些变量显式设置为沙箱的属性(就像我在示例中使用window变量一样)。
  • 隔间不便宜,在隔间之间传递物品也不便宜。因此,为每个函数创建一个隔离专区将是一个坏主意,因为所涉及的开销。

文档:SandboxServices.jsm

更新:从Firefox 13开始,情况发生了变化。例如,this extension将显示当前内存中的所有对象。虽然距离感觉还不舒服,但整体情况并非平凡 - 但它可以让您在隔间以下的水平上获得粒度。