如何测量Firefox插件的内存使用情况

7


我正在使用XUL开发火狐浏览器的插件,现在想要测量和分析我的插件的内存使用情况。
请问如何实现?以及如何检查哪些函数占用了最多的内存,以及我的扩展对火狐浏览器的内存增加了多少?


不确定这是否对您有所帮助...但是您可以在地址栏中键入“about:memory”,但我认为它不会像您希望的那样详细。 - Betard Fooser
关于:memory根本没有帮助,为了理解其中的内容,我需要学习Firefox内存使用方式...这太多了。 - Yosi
1个回答

6
您无法衡量单个函数的影响,Firefox 的内存管理不是在这个级别上工作 - 它是通过隔离区(compartments)来实现的。如果您的扩展程序有自己的窗口,则可以在 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 更新:自Firefox 13以来,情况发生了变化。例如,有这个扩展,可以显示当前所有对象的内存使用情况。仍远非舒适,获取整个图片也不是易事,但它可以让您在隔间以下的级别上进行细分。

非常感谢,我的代码正在沙盒中运行,现在我只需要将名称添加到我的沙盒中,然后就可以对其进行性能分析了,谢谢! - Yosi
1
@Yosy:请查看我的答案更新,现在您可以查看整个 JavaScript 对象图。 - Wladimir Palant
谢谢Vladimir,多亏了你的原始回答,我优化了我的扩展程序内存使用,我会试试这个扩展 :) - Yosi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接