Описание структуры моментального снимка кучи хрома

#javascript #google-chrome-devtools #javascript-objects #heap-memory #snapshot

Вопрос:

Используя selenium, я сделал снимок веб-сайта в памяти driver.execute_script(":takeHeapSnapshot") и извлек его метаданные:

 {  "snapshot": {  "meta": {  "node_fields": [  "type", "name", "id", "self_size", "edge_count", "trace_node_id", "detachedness"  ],  "node_types": [  ["hidden", "array", "string", "object", "code", "closure", "regexp", "number", "native", "synthetic", "concatenated string", "sliced string", "symbol", "bigint"],  "string", "number", "number", "number", "number", "number"  ],  "edge_fields": [  "type", "name_or_index", "to_node"  ],  "edge_types": [  ["context", "element", "property", "internal", "hidden", "shortcut", "weak"],  "string_or_number", "node"  ],  "trace_function_info_fields": [  "function_id", "name", "script_name", "script_id", "line", "column"  ],  "trace_node_fields": [  "id", "function_info_index", "count", "size", "children"  ],  "sample_fields": [  "timestamp_us", "last_assigned_id"  ],  "location_fields": [  "object_index", "script_id", "line", "column"  ]  },  "node_count": 6182075,  "edge_count": 17793245,  "trace_function_count": 0  } }  

Может ли кто-нибудь объяснить, пожалуйста, что означает каждое поле и как использовать эту информацию для извлечения данных? Что такое узлы, ребра, поля местоположения и т.д. Например, допустим, у меня есть массив в куче, размер которого я знаю (и он уникален), и я хочу получить этот массив. Можно ли это сделать с помощью моментального снимка?

Ответ №1:

группа мета — полей объясняет содержимое различных массивов моментального снимка.

Снимок содержит массив узлов. Этот массив содержит 7 чисел для каждого узла в куче, и массив node_fields описывает значение всех этих 7 чисел.

в то же время массив node_types описывает типы для этих 7 чисел. Например, если у вас есть следующие 7 чисел в массиве узлов[ ….., 2, 9, 13, 42, 0, 0, 0, ……

затем N-й узел в куче

  1. имеет строку «тип», потому что node_types[0][2] == ‘строка’,
  2. имеет «имя», которое скрыто в массиве строк кучи. т. е. строки[9],
  3. имеет «идентификатор» 13,
  4. использует 42 байта кучи
  5. имеет 0 ссылок на другие объекты в куче
  6. имеет «trace_node_id» = 0,
  7. имеет «отстраненность» = 0,

Массив ребер содержит триплет чисел для каждого ребра, и вы можете видеть имена каждого числа в полях edges_ и типы в массиве edge_types. Например, триплет 2, 17, 79 в массиве ребер со смещением 0 означает:

  1. ребро на самом деле является свойством объекта, потому что edge_types[0][2] = ‘свойство’
  2. имя свойства скрыто в массиве строк с индексом 17
  3. и он указывает на узел с идентификатором 79. (на самом деле я забыл, это индекс узла или идентификатор узла)
  4. если первый узел массива узлов имеет значение edge_count = 2, то первые 2 триплета массива ребер являются ребрами от этого узла к некоторым другим узлам и т. Д.

Я надеюсь, что это объяснение может пролить свет на то, как понять содержимое моментального снимка кучи.

Комментарии:

1. О, значит, снимки представляют собой график памяти, и поэтому эти поля называются «узлами» и «краями»? Сначала я действительно смутился, называя имя. Но есть ли способ получить фактические значения?