#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-й узел в куче
- имеет строку «тип», потому что node_types[0][2] == ‘строка’,
- имеет «имя», которое скрыто в массиве строк кучи. т. е. строки[9],
- имеет «идентификатор» 13,
- использует 42 байта кучи
- имеет 0 ссылок на другие объекты в куче
- имеет «trace_node_id» = 0,
- имеет «отстраненность» = 0,
Массив ребер содержит триплет чисел для каждого ребра, и вы можете видеть имена каждого числа в полях edges_ и типы в массиве edge_types. Например, триплет 2, 17, 79 в массиве ребер со смещением 0 означает:
- ребро на самом деле является свойством объекта, потому что edge_types[0][2] = ‘свойство’
- имя свойства скрыто в массиве строк с индексом 17
- и он указывает на узел с идентификатором 79. (на самом деле я забыл, это индекс узла или идентификатор узла)
- если первый узел массива узлов имеет значение edge_count = 2, то первые 2 триплета массива ребер являются ребрами от этого узла к некоторым другим узлам и т. Д.
Я надеюсь, что это объяснение может пролить свет на то, как понять содержимое моментального снимка кучи.
Комментарии:
1. О, значит, снимки представляют собой график памяти, и поэтому эти поля называются «узлами» и «краями»? Сначала я действительно смутился, называя имя. Но есть ли способ получить фактические значения?