Терминология памяти

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

Описанные здесь положения и понятия относятся к панели память. Если вы когда-либо работали с приложением Java, .NET или какой-либо другой профилировщиком памяти, это может быть новым.

Размеры объектов

Рассматривайте память как графы с примитивными типами \ (например, числа и строки ) и Objects \ (ассоциативные массивы ). Он может наглядно представлять собой граф с числом взаимосвязанные точек, как описано ниже.

Визуальное представление памяти

Объект может содержать память двумя способами:

  • Непосредственно объектом.
  • Неявным образом, сохраняя ссылки на другие объекты и предотвращая автоматическое удаление этих объектов сборщиком мусора (GC для коротких ).

При работе с панелью памяти в DevTools \ (средство для исследования проблем с памятью, обнаруженных в памяти), вы можете просмотреть несколько разных столбцов данных. Два из них выделены неполной и сохраненной размерностью, но что они представляют?

Неглубокий и сохраненный размер

Неглубокий размер

Это размер памяти, занимаемой объектом.

Типичные объекты JavaScript зарезервированы для их описания и для хранения непосредственных значений. Обычно массивы и строки можно использовать для значительного небольшого размера. Однако строки и внешние массивы часто имеют основное хранилище в памяти обработчика, предоставляя только небольшой объект-оболочку в куче JavaScript.

Память рендеринга — это вся память процесса, на котором выводится проверенная страница: собственная память + JS-память кучи Page + JS для всех выделенных сотрудников, запущенных страницей. Тем не менее, даже небольшой объект может косвенно хранить большое количество памяти, предотвращая удаление других объектов с помощью автоматического процесса сборки мусора.

Сохраненный размер

Это размер памяти, которая освобождается после удаления объекта вместе с зависимыми объектами, которые были сделаны недостижимыми из корней сборщика мусора \ (корни GC ).

Корни сборщика мусора \ (корни GC ) состоят из дескрипторов , созданных с помощью локальных и глобальных данных, при создании ссылки из машинного кода на объект JavaScript за пределами V8. Все подобные дескрипторы могут быть найдены в снимке кучи в разделе корни GC > , которыеуправляют GC roots > глобальными дескрипторамиобластей и корней GC. Описание дескрипторов в этой документации без подробностей о реализации браузера может быть запутанным. Как корни сборщика мусора, так и дескрипторы — это не то, что вам нужно беспокоиться.

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

  • Глобальный объект Window \ (в каждом интернет-кадре). В снимках кучи есть поле расстояния, представляющее собой число ссылок на свойства в кратчайшем пути хранения из окна.
  • Дерево документов DOM, состоящее из всех исходных узлов DOM, которые можно получить, обходимым документом. Не все узлы могут иметь оболочки JS, но если на нем есть обертка, она действует, пока документ активен.
  • Иногда объекты могут храниться контекстом отладчика на панели источники и на консоли (например, после вычисления консоли). Создание моментальных снимков кучи с помощью очищенной консоли и без активных точек останова в отладчике на панели « источники ».

Совет

Очистите панель консоли , запустив clear() и деактивируйте точки останова на панели « источники », прежде чем делать снимок кучи на панели «память».

Граф памяти начинается с корневого элемента, который может представлять собой window объект браузера или Global объект модуля Node.js. Нельзя управлять тем, как этот корневой объект собирается сборщиком мусора (НОД).

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

В корне нет доступа к собранию мусора \ (НОД ).

Примечание

Столбцы " неглубокий размер " и " сохраненный размер " представляют данные в байтах.

Дерево сохраненных объектов

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

  • Для узлов \ (или объектов) задана метка с использованием имени функции- конструктора , которая использовалась для их построения.
  • Края помечены с использованием имен свойств.

Сведения о том, как записать профиль с помощью профилировщика кучи. На приведенном ниже рисунке показаны некоторые из глазных элементов, которые можно увидеть в записи снимков кучи на панели памяти : расстояние от сборщика мусора \ (GC ). Если почти все объекты одного и того же типа находятся на одном и том же расстоянии, то это может потребоваться для исследования.

Расстояние от корня

Лидеры

Лидерские объекты состоят из древовидной структуры, так как у каждого объекта есть только один лидер. У лидера объекта могут отсутствовать прямые ссылки на объект, который он является лидером; Это значит, что дерево лидера не является деревом графа.

На приведенном ниже рисунке верно следующее утверждение:

  • Узел 1, являющийся узлом 2
  • Узел 2 — это узлы 3, 4 и 6
  • Узел 3 является узлом 5
  • Узел 5 лидеры в узле 8
  • Узел 6, являющийся узлом 7

Структура дерева (лидера)

На приведенном ниже рисунке Node #3 — это лидер #10 , но он #7 также существует в каждом простом пути от сборщика мусора \ (GC ) to #10 . Таким образом, объект B является лидером объекта A, если в каждом простом пути от корня к объекту A есть B.

Анимированный лидеровый свет

Специальные V8

При профилировании памяти полезно понять, почему снимки кучи выглядят определенным образом. В этом разделе описаны некоторые связанные с памятью разделы, в частности соответствующие виртуальной машине V8 JavaScript \ (V8 VM или VM ).

Представление объекта JavaScript

Существуют три простых типа.

  • Числа \ (например 3.14159... )
  • Логические значения \ ( true или false )
  • Строки \ (например "Werner Heisenberg" )

Примитивы не имеют ссылки на другие значения и всегда Leafs или оконечными узлами.

Числа можно хранить следующим образом:

  • немедленные 31-разрядные целые значения, называемые маленькими целыми числами (SMIs ), или
  • объекты кучи, которые называются номерами кучи. Номера куч используются для хранения значений, которые не помещаются в форму SMI (например, Double), или при необходимости упаковкизначения, например для установки свойств.

Строки можно хранить в одном из следующих вариантов:

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

Память для новых объектов JavaScript выделяется из выделенной кучи JavaScript \ (или кучи ВМ). Эти объекты управляются сборщиком мусора в V8 и, таким образом, остаются в активном состоянии, так как есть хотя бы одна строгая ссылка на них.

Все, что не входит в кучу JavaScript, называется неуправляемым объектом. Собственные объекты, в отличие от объектов кучи, не управляются сборщиком мусора V8 в течение всего времени существования, и к ним можно получить доступ только из JavaScript с помощью объекта-оболочки JavaScript.

Строка "минус " — это объект, который содержит пары строк, которые хранятся, а затем объединены и являются результатом сцепления. Присоединение к строке с ненужным содержимым будет выполняться только по мере необходимости. Примером может быть необходимость создания подстроки присоединенной строки.

Например, если вы выполняете сцепление a b , вы получаете строку, (a, b) представляющую результат сцепления. Если позднее вы объедините d этот результат, вы получите еще одну строку с недостатком ((a, b, d) .

Массив — объект с числовыми ключами. Массивы широко используются в виртуальной машине V8 для хранения больших объемов данных. Наборы пар "ключ-значение", например словарей, заархивированы с помощью массивов.

Типичный объект JavaScript хранится только в одном из двух типов массивов :

  • именованные свойства и
  • числовые элементы

При наличии небольшого количества свойств эти свойства хранятся внутри объекта JavaScript.

Map — это объект, который описывает как вид объекта, так и макет. Например, карты используются для описания неявных иерархий объектов для быстрого доступа к свойствам.

Группы объектов

Каждая группа собственных объектов состоит из объектов, которые содержат взаимные ссылки друг на друга. Рассматривайте, например, поддерево DOM, в котором каждый узел имеет ссылку на относительный родительский объект и ссылки на следующий дочерний элемент и следующий одноуровневый элемент, поэтому для них формируется подключенный граф.

Примечание

Собственные объекты не представлены в куче JavaScript. Отсутствие представления заключается в том, что у собственных объектов нулевой размер. Вместо этого создаются объекты-оболочки.

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

Взаимодействие с командой средств разработчика Microsoft Edge

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

  • Отправьте отзыв с помощью значка " Отправить отзыв " или выберите Alt + Shift + I \ (Windows ) или Option + Shift + I \ (macOS ) в DevTools.
  • Твит на @EdgeDevTools.
  • Отправьте предложение в Интернет.
  • В этой статье описаны ошибки в разделе Отзывы и предложения .

:::image type="complex" source="../media/bing-devtools-send-feedback.msft.png" alt-text="Значок "Отправить отзыв" в Microsoft Edge DevTools" lightbox="../media/bing-devtools-send-feedback.msft.png"::: Значок " Отправить отзыв " в Microsoft Edge DevTools
:::image-end:::

Примечание

Части этой страницы представляют собой изменения, основанные на работе, созданной и предоставленной компанией Google и использованными в соответствии с условиями, описанными в лицензии Creative Commons 4,0 международная лицензия.
Исходная страница будет найдена здесь и была написана с помощью Meggin Kearney \ (технический редактор ).

Лицензия Creative Commons
Эта работа предоставляется в рамках международной лицензии Creative Commons Attribution 4.0 International License.