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

Yos*_*osi 7 memory firefox profiling xul firefox-addon


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

Wla*_*ant 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
Run Code Online (Sandbox Code Playgroud)

因此,myExtension/browserScript.js将显示一个调用的隔离专区about:memory?verbose,您将能够看到此脚本(以及它创建的对象等)的内存大小.要记住的事情:

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

文档:Sandbox,Services.jsm

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