如何衡量firefox插件内存使用情况

如何衡量firefox插件内存使用情况,firefox,memory,firefox-addon,profiling,xul,Firefox,Memory,Firefox Addon,Profiling,Xul,我正在使用XUL开发一个firefox插件,我想测量和分析我的扩展内存使用情况 我该怎么做?并检查哪个函数占用的内存最多,以及我的扩展向firefox添加了多少内存您无法衡量单个功能的影响,Firefox中的内存管理在这个级别上不起作用-它与隔间一起工作。如果您的扩展有自己的窗口,那么您将能够在关于:内存?详细下看到此窗口的分区(单击“最小化内存使用”,否则您可能会在那里看到将被垃圾收集的对象)。如果您的扩展代码在浏览器窗口的上下文中运行,那么您通常运气不佳—您将无法将其与在那里运行的其他脚本区


我正在使用XUL开发一个firefox插件,我想测量和分析我的扩展内存使用情况

我该怎么做?并检查哪个函数占用的内存最多,以及我的扩展向firefox添加了多少内存

您无法衡量单个功能的影响,Firefox中的内存管理在这个级别上不起作用-它与隔间一起工作。如果您的扩展有自己的窗口,那么您将能够在
关于:内存?详细
下看到此窗口的分区(单击“最小化内存使用”,否则您可能会在那里看到将被垃圾收集的对象)。如果您的扩展代码在浏览器窗口的上下文中运行,那么您通常运气不佳—您将无法将其与在那里运行的其他脚本区分开来。XPCOM组件和JavaScript模块也是如此——它们都被加载到“[System Principal]”隔间中

如何将脚本从一个大隔间中分离出来:使用沙盒,沙盒总是有自己的隔间。例如,在浏览器窗口中,您可以执行以下操作:

Components.utils.import(“resource://gre/modules/Services.jsm");
var mySandbox=Components.utils.Sandbox(窗口,
{sandboxName:“myExtension/browserScript.js”});
mySandbox.window=window;//向沙箱中的脚本公开窗口变量
Services.scriptloader.loadSubScript(“chrome://myextension/content/browserScript.js",
mySandbox);
mySandbox.init();//在沙箱中调用脚本的函数init()
因此,一个名为
myExtension/browserScript.js
的隔间将显示在
about:memory?verbose
下,您将能够看到此脚本(以及它创建的对象等)准确占用了多少内存。要记住的事情:

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


更新:从Firefox开始,13件事情发生了变化。例如,有一个示例将向您显示当前内存中的所有对象。虽然还远远不够舒适,但了解整个情况也不是一件小事,但它可以让您在低于隔间的级别上获得粒度。

不确定它是否能帮助您。。。但是你可以在地址栏中输入“about:memory”,但我认为它不会像你希望的那样精确。about:memory一点帮助都没有,为了理解其中的内容,我需要了解firefox内存使用情况。。。这太多了。非常感谢,我的代码正在沙盒中运行,我现在只需要将名称添加到我的沙盒中,然后我就可以分析它了,谢谢@Yosy:请参阅我的答案更新,现在您可以查看整个JavaScript对象图。感谢Vladimir,感谢我在扩展中优化内存使用的原始答案,我将检查此扩展:)