Как измерить использование памяти дополнением Firefox - PullRequest
7 голосов
/ 06 февраля 2012


Я разрабатываю надстройку Firefox с использованием XUL и хочу измерить и профилировать использование памяти расширения.
Как я могу это сделать? и проверьте, какая функция использует больше всего памяти и сколько памяти использует мое расширение для Firefox?

1 Ответ

6 голосов
/ 07 февраля 2012

Вы не можете измерить влияние одной функции, управление памятью в 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 в примере).
  • Отсеки не дешевы, а передача объектов между отсеками недешеваили.Поэтому создание одного отделения для каждой функции было бы плохой идеей из-за накладных расходов.

Документация: Песочница , Services.jsm

Обновление : Начиная с Firefox 13 вещей изменилось.Например, это расширение , которое покажет вам все объекты, которые в данный момент находятся в памяти.Все еще далеко от того, чтобы быть удобным, также получение всей картины нетривиально - но это дает вам детализацию на уровне ниже отсеков.

...