1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
---
title: 'about:memory'
slug: 'Mozilla/Performance/about:memory'
tags:
- Память
- Производительность
- диагностика
translation_of: 'Mozilla/Performance/about:memory'
---
<p>about:memory это специальная страница браузера Firefox, позволяющая просматривать, сохранять, загружать и сравнивать информацию об использовании браузером памяти. Также, она дает возможность проводить другие операции, связанные с памятью, такие как GC и CC, сохранение логов GC & CC и сохранение отчетов DMD. Эта страница присутствует во всех сборках браузера и не требует установки дополнительных программ.</p>
<h2 id="Как_создать_отчет_об_используемой_памяти">Как создать отчет об используемой памяти</h2>
<p>Представим, что вам нужно узнать как и сколько памяти использует Firefox. Возможно, вам нужно провести анализ использования памяти, или кто-то попросил вас воспользоваться страницей about:memory чтобы создать отчет "memory reports" и исследовать имеющуюся у вас проблему. Выполните следующие шаги.</p>
<ul>
<li>Когда вам понадобится сделать замер текущей памяти (например, когда количество используемой Firefox памяти резко увеличилось) откройте новую вкладку, введите "about:memory" в адресную строку и нажмите "Enter".</li>
<li>Если вам необходимо передать информацию об используемой памяти, например загрузить в Bugzilla или отправить по почте, нажмите на кнопку "Measure and save...". Откроется диалог, в котором вы сможете сохранить отчет в выбранный файл (у файла будет расширение <code>.json.gz</code>). После этого вы сможете соответственно загрузить или переслать файл, а получатель сможет открыть его в своей версии Firefox.</li>
<li>Если вам нужно передать информацию в текстовом виде, например, в виде комментария на веб-сайте, нажмите на кнопку "Measure...". После этого информация об используемой памяти будет выведена в виде дерева прямо на странице about:memory. Информация будет представлена обычным текстом, так что вы сможете копировать и вставлять его как целиком, так и частями (вам не придется делать скриншоты). В этом тексте будет менее подробная информация об использовании ппамяти, чем в файле отчета, но даже этой информации иногда достаточно для диагностики. Не стоит жать кнопку "Measure..." несколько раз. Это приведет к тому, что страница about:memory сама начнет потреблять больше памяти, из-за добавления и удаления большого количества DOM узлов.</li>
</ul>
<p>Обратите внимание, что в обоих случаях отчет будет содержать такую приватную информацию, как, например, полный список всех ваших открытых вкладок. Если вы не хотите делиться этой информацией, то у чекбокса "anonymize" должна быть проставлена галочка перед тем, как нажимать на "Measure and save..." или "Measure...". Тогда вся приватная информация из отчета будет удалена, но это может усложнить диагностику памяти.</p>
<h2 id="Загрузка_memory_report_из_файла">Загрузка memory report из файла</h2>
<p>Самый простой способ загрузить memory report из файла, это использовать кнопку "Load...". Еще вы можете использовать кнопку "Load and diff..." чтобы получить diff (сравнение) между двумя отчетами.</p>
<p>Также можно автоматически загрузить одиночный отчет, добавив в адресную сторку параметр file, у которого в качестве значения прописать путь до файла отчета:</p>
<pre>about:memory?file=/home/username/reports.json.gz
</pre>
<p>Это особенно полезно при загрузке отчета, полученного с устройства на Firefox OS. </p>
<p>Отчеты сохраняются в виде заархивированого JSON. В последствии они могут быть загружены как в виде архива, так и из распокованого JSON файла.</p>
<h2 id="Как_интерпретировать_memory_reports">Как интерпретировать memory reports</h2>
<p>Почти все, что вы видите на странице about:memory, имеет всплывающую подсказку. Наведите курсор на любую кнопку и вы узнаете, что она делает. Наведите курсор на любую измерение и вы увидите его описание.</p>
<h3 id="Базовые_понятия_измерений"><span class="mw-headline" id="Basics">Базовые понятия измерений</span></h3>
<p>Большинство измерений исчисляются в байтах, однако могут использоваться также количественные и процентные единицы.</p>
<p>Большинство измерений представлены в виде деревьев. Пример:</p>
<pre> 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
</pre>
<p>Листья этих деревьев отображают непосредтвенно затраченную память, а узлы представляют суммарные затраты памяти все своих потомков.</p>
<p>Древовидное представление позволяет разбивать измерения на различные категории, подкатегории и т.д., на любую необходиму глубину. Все измерения в пределах одного дерева уникальны и не повторяются.</p>
<p>Пути в дереве описываются с ипользованием '/' в качестве разделителя. Например, <code>preference/referent/weak/dead</code> это путь до листа dead в примере выше.</p>
<p>Поддеревья могут быть свернуты или развернуты при клике по ним. Если вы хотите исследовать интересующее вас поддерево, то будет полезным сначала свернуть его в корневом узле, а потом постепенно раскрывать интересующие вас под-деревья.</p>
<h3 id="Секции"><span class="mw-headline" id="Sections">Секции</span></h3>
<p>Memory reports are displayed on a per-process basis, with one process per section. Within each process's measurements, there are the following subsections.</p>
<h4 id="Явное_выделение_памяти_(Explicit_Allocations)">Явное выделение памяти (Explicit Allocations)</h4>
<p>Эта секция содержит дерево под названием "explicit". Вся затраченная в этом дереве память выделена при помощи функций явного выделения памяти (таких как <code>malloc</code> и <code>new</code>) и функциями выделения без использования кучи (non-heap) (такими как <code>mmap</code> и <code>VirtualAlloc</code>).</p>
<p>Далее представлен пример сессии, в которой открыты вкладки cnn.com, techcrunch.com, и arstechnica.com. Некоторые подеревья были развернуты, другие наоборот скрыты для большей наглядности. </p>
<pre>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</pre>
<p>Для того, чтобы понять некоторые детали необходим опыт, но вот некоторые важные моменты, на которые стоит обратить внимание.</p>
<ul>
<li>Значение узла "explicit" представляет собой всю память, которая была выделена при помощи явных функций.</li>
<li>Поддерево "window-objects" отображает все объекты window JavaScript'а, включая открытые вкладки и окна. Например, поддерево "top(http://edition.cnn.com/, id=8)" представляет вкладку, которая была открыта со страницы cnn.com, а "top(chrome://browser/content/browser.xul, id=3)" отображает окно графического интерфейса браузера.</li>
<li>Внутри каждого измерения window есть такие поддеревья JavaScript, как ("js-compartment(...)" and "js-zone(...)"), layout, style-sheets, DOM, и так далее.</li>
<li>Понятно, что вкладка cnn.com использует больше памяти чем techcrunch.com tab, а та в свою очередь использует больше, чем arstechnica.com tab.</li>
<li>Поддеревья с именами вроде "(2 tiny)" это искуственные объединения в узлы небольших по размеру поддеревьев, которые по умолчанию свернуты. Если перед измерением выбрать чекбокс "verbose" все деревья будут раскрыты и никаких искуственных узлов добавлено не будет.</li>
<li>Поддерево "js-non-window" отображает потребление памяти JavaScript'ом не из объектов window, а из ядра браузера.</li>
<li>Поддерево "heap-unclassified" отображает затраченную память, которая не подходит под другие секции . Обычно это 10--20% от дерева "explicit". Если эти затраты становятся больше, следует использовать дополнительные методы измерения памяти. При помощи <a href="/en-US/docs/Mozilla/Performance/DMD" title="Performance/MemShrink/DMD">DMD</a> можно выяснить, где именно их следует добавлять.</li>
<li>Существуют измерения и для других видов контента, таких как изображения и workers, а также для подсистем браузера, такех как начальный кэш и XPConnect.</li>
</ul>
<p>Как показывает следующий пример, можно измерить потребления памяти некоторыми дополнениями.</p>
<pre>├───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)</pre>
<p>Моменты, на которые стоит обратить внимание. </p>
<ul>
<li>Измерения некоторых дополнений, таких как Tree Style Tab, можно опознать по имени. Другие дополнения идентифицируются только по шестнадцатиричному идентификатору. На странице about:support вы можете узнать, к какому дополнению относится тот или иной идентификатор. Например, <code>59c81df5-4b7a-477b-912d-4e0fdf64e5f2</code> это Chatzilla.</li>
<li>Вся используемая JavaScript память, относящаяся к дополнениям, показывается в этом дереве.</li>
<li>Для дополнений, использующих отдельные окна, таких как Chatzilla, потребление памяти этими окнами также показывается в этом дереве.</li>
<li>Для дополнений, использующих XUL overlays, таких как AdBlock Plus, потребление памяти этими overlays в данном дереве отображено не будет; вместо этого оно будет отображено в поддереве non-add-on и не будет идентифицировано как вызванное определенным дополнением.</li>
</ul>
<h4 id="Прочие_измерения_(Other_Measurements)">Прочие измерения (Other Measurements)</h4>
<p>Этот раздел содержит деревья, которые в дереве "explicit" были урезаны и упрощены. Например, в дереве "explicit" все измерения DOM и layout были разбиты по окнам, но в секции Прочие измерения (Other Measurements) они собраны со всего браузера и сгруппированы, что и демонстрирует следующий пример.</p>
<pre>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</pre>
<p>Но некоторые деревья в этом разделе не включают в себя данные из дерева "explicit". К таким можно отнести "preference-service" из примера выше.</p>
<p>В конце этого раздела находятся еденичные измерения:</p>
<pre> 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</pre>
<p>Среди этих измерений некоторые хочется выделить.</p>
<ul>
<li>"resident". Использование физической памяти. Если вам нужен один единственный параметр, обощающий использование памяти, то это, возможно, лучший вариант.</li>
<li>"vsize". Использование виртульаной памяти. Зачастую бывает намного больше остальных измерений (особенно на Mac). Имеет значение только на 32-разрядных системах, например Win32. Существует также "vsize-max-contiguous" (измереяется не на всех платформах и в этом примере не показан), который показывает самый большой доступный фрагмент виртуального адрессного пространства. Если это число будет слишком маленьким, то довольно скоро попытка выделить память вызовет ошибку из-за недостатка виртуальной памяти.</li>
<li>Различные измерения, связанные с графикой ("gfx-*"). Могут варьироваться между разными платформами. Графика часто является источником высокого использования памяти, так что эти измерения могут быть полезны для обнаружения таких случаев.</li>
</ul>
<h4 id="Система">Система</h4>
<p>Этот раздел доступен только на Firefox OS. Он содержит все измерения устройства, полученные от операционной системы. Среди прочего, этот раздел бывает полезен для понимания как устройство использует память здесь и сейчас.</p>
|