【问题标题】:How to measure firefox add-on memory usage如何测量 Firefox 附加内存使用情况
【发布时间】:2012-02-28 05:17:45
【问题描述】:


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

【问题讨论】:

  • 不确定它是否对您有帮助...但您可以在地址栏中输入“about:memory”,但我认为它不会像您希望的那样精细。
  • about:memory 根本没有帮助,为了理解其中的一些内容,我需要了解 firefox 内存使用的工作原理......这太多了。

标签: firefox memory firefox-addon profiling xul


【解决方案1】:

您无法衡量单个功能的影响,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 下,您将能够看到该脚本(以及它创建的对象等)准确占用了多少内存。需要注意的事项:

  • 沙盒中的脚本无法从“外部”访问变量。您必须将这些变量显式设置为沙盒的属性(就像我在示例中使用 window 变量所做的那样)。
  • 隔间并不便宜,在隔间之间传递对象也不便宜。因此,为每个功能创建一个隔间将是一个坏主意,因为涉及的开销。

文档:SandboxServices.jsm

更新:从 Firefox 13 开始,事情发生了变化。例如,this extension 会显示当前内存中的所有对象。仍然远非舒适,获得整个画面也并非易事 - 但它为您提供了低于隔间的粒度。

【讨论】:

  • 非常感谢,我的代码在沙箱中运行,我现在只需将名称添加到沙箱中,然后我就可以对其进行分析了,谢谢!
  • @Yosy:查看我的答案的更新,现在您可以查看整个 JavaScript 对象图。
  • 感谢弗拉基米尔,感谢原始答案我优化了我的扩展程序中的内存使用,我会检查这个扩展程序:)
最近更新 更多