MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

about:memory это специальная страница браузера Firefox, позволяющая просматривать, сохранять, загружать и сравнивать информацию об использовании браузером памяти. Также, она дает возможность проводить другие операции, связанные с памятью, такие как GC и CC, сохранение логов GC & CC и сохранение отчетов DMD. Эта страница присутствует во всех сборках браузера и не требует установки дополнительных программ.

Как создать отчет об используемой памяти

Представим, что вам нужно узнать как и сколько памяти использует Firefox. Возможно, вам нужно провести анализ использования памяти, или кто-то попросил вас воспользоваться страницей about:memory чтобы создать отчет "memory reports" и исследовать имеющуюся у вас проблему. Выполните следующие шаги.

  • Когда вам понадобится сделать замер текущей памяти (например, когда количество используемой Firefox памяти резко увеличилось) откройте новую вкладку, введите "about:memory" в адресную строку и нажмите "Enter".
  • Если вам необходимо передать информацию об используемой памяти, например загрузить в Bugzilla или отправить по почте, нажмите на кнопку "Measure and save...". Откроется диалог, в котором вы сможете сохранить отчет в выбранный файл (у файла будет расширение .json.gz). После этого вы сможете соответственно загрузить или переслать файл, а получатель сможет открыть его в своей версии Firefox.
  • Если вам нужно передать информацию в текстовом виде, например, в виде комментария на веб-сайте, нажмите на кнопку "Measure...". После этого информация об используемой памяти будет выведена в виде дерева прямо на странице about:memory. Информация будет представлена обычным текстом, так что вы сможете копировать и вставлять его как целиком, так и частями (вам не придется делать скриншоты). В этом тексте будет менее подробная информация об использовании ппамяти, чем в файле отчета, но даже этой информации иногда достаточно для диагностики. Не стоит жать кнопку "Measure..." несколько раз. Это приведет к тому, что страница about:memory сама начнет потреблять больше памяти, из-за добавления и удаления большого количества DOM узлов.

Обратите внимание, что в обоих случаях отчет будет содержать такую приватную информацию, как, например, полный список всех ваших открытых вкладок. Если вы не хотите делиться этой информацией, то у чекбокса "anonymize" должна быть проставлена галочка перед тем, как нажимать на "Measure and save..." или "Measure...". Тогда вся приватная информация из отчета будет удалена, но это может усложнить диагностику памяти.

Загрузка memory report из файла

Самый простой способ загрузить memory report из файла, это использовать кнопку "Load...". Еще вы можете использовать кнопку "Load and diff..." чтобы получить diff (сравнение) между двумя отчетами.

Также можно автоматически загрузить одиночный отчет, добавив в адресную сторку параметр file, у которого в качестве значения  прописать путь до файла отчета:

about:memory?file=/home/username/reports.json.gz

Это особенно полезно при загрузке отчета, полученного с устройства на Firefox OS. 

Отчеты сохраняются в виде заархивированого JSON. В последствии они могут быть загружены как в виде архива, так и из распокованого JSON файла.

Как интерпретировать memory reports

Почти все, что вы видите на странице about:memory, имеет всплывающую подсказку. Наведите курсор на любую кнопку и вы узнаете, что она делает. Наведите курсор на любую измерение и вы увидите его описание.

Базовые понятия измерений

Большинство измерений исчисляются в байтах, однако могут использоваться также количественные и процентные единицы.

Большинство измерений представлены в виде деревьев. Пример:

 585 (100.0%) -- preference-service
 └──585 (100.0%) -- referent
    ├──493 (84.27%) ── strong
    └───92 (15.73%) -- weak
        ├──92 (15.73%) ── alive
        └───0 (00.00%) ── dead

Листья этих деревьев отображают непосредтвенно затраченную память, а узлы представляют суммарные затраты памяти все своих потомков.

Древовидное представление позволяет разбивать измерения на различные категории, подкатегории и т.д., на любую необходиму глубину. Все измерения в пределах одного дерева уникальны и не повторяются.

Пути в дереве описываются с ипользованием '/' в качестве разделителя. Например, preference/referent/weak/dead это путь до листа dead в примере выше.

Поддеревья могут быть свернуты или развернуты при клике по ним. Если вы хотите исследовать интересующее вас поддерево, то будет полезным сначала свернуть его в корневом узле, а потом постепенно раскрывать интересующие вас под-деревья.

Секции

Memory reports are displayed on a per-process basis, with one process per section. Within each process's measurements, there are the following subsections.

Явное выделение памяти (Explicit Allocations)

Эта секция содержит дерево под названием "explicit". Вся затраченная в этом дереве память выделена при помощи функций явного выделения памяти (таких как malloc и new) и функциями выделения без использования кучи (non-heap) (такими как mmap и VirtualAlloc).

Далее представлен пример сессии, в которой открыты вкладки cnn.com, techcrunch.com, и arstechnica.com. Некоторые подеревья были развернуты, другие наоборот скрыты для большей наглядности. 

191.89 MB (100.0%) -- explicit
├───63.15 MB (32.91%) -- window-objects
│   ├──24.57 MB (12.80%) -- top(http://edition.cnn.com/, id=8)
│   │  ├──20.18 MB (10.52%) -- active
│   │  │  ├──10.57 MB (05.51%) -- window(http://edition.cnn.com/)
│   │  │  │  ├───4.55 MB (02.37%) ++ js-compartment(http://edition.cnn.com/)
│   │  │  │  ├───2.60 MB (01.36%) ++ layout
│   │  │  │  ├───1.94 MB (01.01%) ── style-sheets
│   │  │  │  └───1.48 MB (00.77%) -- (2 tiny)
│   │  │  │      ├──1.43 MB (00.75%) ++ dom
│   │  │  │      └──0.05 MB (00.02%) ── property-tables
│   │  │  └───9.61 MB (05.01%) ++ (18 tiny)
│   │  └───4.39 MB (02.29%) -- js-zone(0x7f69425b5800)
│   ├──15.75 MB (08.21%) ++ top(http://techcrunch.com/, id=20)
│   ├──12.85 MB (06.69%) ++ top(http://arstechnica.com/, id=14)
│   ├───6.40 MB (03.33%) ++ top(chrome://browser/content/browser.xul, id=3)
│   └───3.59 MB (01.87%) ++ (4 tiny)
├───45.74 MB (23.84%) ++ js-non-window
├───33.73 MB (17.58%) ── heap-unclassified
├───22.51 MB (11.73%) ++ heap-overhead
├────6.62 MB (03.45%) ++ images
├────5.82 MB (03.03%) ++ workers/workers(chrome)
├────5.36 MB (02.80%) ++ (16 tiny)
├────4.07 MB (02.12%) ++ storage
├────2.74 MB (01.43%) ++ startup-cache
└────2.16 MB (01.12%) ++ xpconnect

Для того, чтобы понять некоторые детали необходим опыт, но вот некоторые важные моменты, на которые стоит обратить внимание.

  • Значение узла "explicit" представляет собой всю память, которая была выделена при помощи явных функций.
  • Поддерево "window-objects" отображает все объекты window JavaScript'а, включая открытые вкладки и окна. Например, поддерево "top(http://edition.cnn.com/, id=8)" представляет вкладку, которая была открыта со страницы cnn.com, а "top(chrome://browser/content/browser.xul, id=3)" отображает окно графического интерфейса браузера.
  • Внутри каждого измерения window есть такие поддеревья JavaScript, как  ("js-compartment(...)" and "js-zone(...)"), layout, style-sheets, DOM, и так далее.
  • Понятно, что вкладка cnn.com использует больше памяти чем techcrunch.com tab, а та в свою очередь использует больше, чем arstechnica.com tab.
  • Поддеревья с именами вроде "(2 tiny)" это искуственные объединения в узлы небольших по размеру поддеревьев, которые по умолчанию свернуты. Если перед измерением выбрать чекбокс "verbose" все деревья будут раскрыты и никаких искуственных узлов добавлено не будет.
  • Поддерево "js-non-window" отображает потребление памяти JavaScript'ом не из объектов window, а из ядра браузера.
  • Поддерево "heap-unclassified" отображает затраченную память, которая не подходит под другие секции . Обычно это 10--20% от дерева "explicit". Если эти затраты становятся больше, следует использовать дополнительные методы измерения памяти. При помощи DMD можно выяснить, где именно их следует добавлять.
  • Существуют измерения и для других видов контента, таких как изображения и workers, а также для подсистем браузера, такех как начальный кэш и XPConnect.

Как показывает следующий пример, можно измерить потребления памяти некоторыми дополнениями.

├───40,214,384 B (04.17%) -- add-ons
│   ├──21,184,320 B (02.20%) ++ {d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/js-non-window/zones/zone(0x100496800)/compartment([System Principal], jar:file:///Users/njn/Library/Application%20Support/Firefox/Profiles/puna0zr8.new/extensions/%7Bd10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d%7D.xpi!/bootstrap.js (from: resource://gre/modules/addons/XPIProvider.jsm:4307))
│   ├──11,583,312 B (01.20%) ++ jid1-xUfzOsOFlzSOXg@jetpack/js-non-window/zones/zone(0x100496800)
│   ├───5,574,608 B (00.58%) -- {59c81df5-4b7a-477b-912d-4e0fdf64e5f2}
│   │   ├──5,529,280 B (00.57%) -- window-objects
│   │   │  ├──4,175,584 B (00.43%) ++ top(chrome://chatzilla/content/chatzilla.xul, id=4293)
│   │   │  └──1,353,696 B (00.14%) ++ top(chrome://chatzilla/content/output-window.html, id=4298)
│   │   └─────45,328 B (00.00%) ++ js-non-window/zones/zone(0x100496800)/compartment([System Principal], file:///Users/njn/Library/Application%20Support/Firefox/Profiles/puna0zr8.new/extensions/%7B59c81df5-4b7a-477b-912d-4e0fdf64e5f2%7D/components/chatzilla-service.js)
│   └───1,872,144 B (00.19%) ++ treestyletab@piro.sakura.ne.jp/js-non-window/zones/zone(0x100496800)

Моменты, на которые стоит обратить внимание. 

  • Измерения некоторых дополнений, таких как Tree Style Tab, можно опознать по имени. Другие дополнения идентифицируются только по шестнадцатиричному идентификатору. На странице about:support вы можете узнать, к какому дополнению относится тот или иной идентификатор. Например, 59c81df5-4b7a-477b-912d-4e0fdf64e5f2 это Chatzilla.
  • Вся используемая JavaScript память, относящаяся к дополнениям, показывается в этом дереве.
  • Для дополнений, использующих отдельные окна, таких как Chatzilla, потребление памяти этими окнами также показывается в этом дереве.
  • Для дополнений, использующих XUL overlays, таких как AdBlock Plus, потребление памяти этими overlays в данном дереве отображено не будет; вместо этого оно будет отображено в поддереве non-add-on и не будет идентифицировано как вызванное определенным дополнением.

Прочие измерения (Other Measurements)

Этот раздел содержит деревья, которые в дереве "explicit" были урезаны и упрощены. Например, в дереве "explicit" все измерения DOM и layout были разбиты по окнам, но в секции Прочие измерения (Other Measurements) они собраны со всего браузера и сгруппированы, что и демонстрирует следующий пример.

26.77 MB (100.0%) -- window-objects
├──14.59 MB (54.52%) -- layout
│  ├───6.22 MB (23.24%) ── style-sets
│  ├───4.00 MB (14.95%) ── pres-shell
│  ├───1.79 MB (06.68%) ── frames
│  ├───0.89 MB (03.33%) ── style-contexts
│  ├───0.62 MB (02.33%) ── rule-nodes
│  ├───0.56 MB (02.10%) ── pres-contexts
│  ├───0.47 MB (01.75%) ── line-boxes
│  └───0.04 MB (00.14%) ── text-runs
├───6.53 MB (24.39%) ── style-sheets
├───5.59 MB (20.89%) -- dom
│   ├──3.39 MB (12.66%) ── element-nodes
│   ├──1.56 MB (05.84%) ── text-nodes
│   ├──0.54 MB (02.03%) ── other
│   └──0.10 MB (00.36%) ++ (4 tiny)
└───0.06 MB (00.21%) ── property-tables

Но некоторые деревья в этом разделе не включают в себя данные из дерева "explicit". К таким можно отнести "preference-service" из примера выше.

В конце этого раздела находятся еденичные измерения:

    0.00 MB ── canvas-2d-pixels
    5.38 MB ── gfx-surface-xlib
    0.00 MB ── gfx-textures
    0.00 MB ── gfx-tiles-waste
          0 ── ghost-windows
  109.22 MB ── heap-allocated
        164 ── heap-chunks
    1.00 MB ── heap-chunksize
  114.51 MB ── heap-committed
  164.00 MB ── heap-mapped
      4.84% ── heap-overhead-ratio
          1 ── host-object-urls
    0.00 MB ── imagelib-surface-cache
    5.27 MB ── js-main-runtime-temporary-peak
          0 ── page-faults-hard
    203,349 ── page-faults-soft
  274.99 MB ── resident
  251.47 MB ── resident-unique
1,103.64 MB ── vsize

Среди этих измерений некоторые хочется выделить.

  • "resident". Использование физической памяти. Если вам нужен один единственный параметр, обощающий использование памяти, то это, возможно, лучший вариант.
  • "vsize". Использование виртульаной памяти. Зачастую бывает намного больше остальных измерений (особенно на Mac). Имеет значение только на 32-разрядных системах, например Win32. Существует также "vsize-max-contiguous" (измереяется не на всех платформах и в этом примере не показан), который показывает самый большой доступный фрагмент виртуального адрессного пространства. Если это число будет слишком маленьким, то довольно скоро попытка выделить память вызовет ошибку из-за недостатка виртуальной памяти.
  • Различные измерения, связанные с графикой ("gfx-*"). Могут варьироваться между разными платформами. Графика часто является источником высокого использования памяти, так что эти измерения могут быть полезны для обнаружения таких случаев.

Система

Этот раздел доступен только на Firefox OS. Он содержит все измерения устройства, полученные от операционной системы. Среди прочего, этот раздел бывает полезен для понимания как устройство использует память здесь и сейчас.

Метки документа и участники

 Внесли вклад в эту страницу: mrsndmn, T-150, karambaJob
 Обновлялась последний раз: mrsndmn,