Я использую Puppeteer, чтобы найти проблему утечки памяти. Я использую API-интерфейс puppeteer page.metrics(), но у меня возникли проблемы с пониманием каждого значения свойства. Все мои значения в метриках со временем увеличиваются. Ожидается ли это? Или это свидетельствует о серьезной утечке памяти?
Свойства, которые растут в стоимости при JSEventListeners, Nodes, LayoutCount, RecalcStyleCount, LayoutDuration, RecalcStyleDuration, ScriptDuration, TaskDuration, JSHeapUsedSize, JSHeapTotalSize
приложения: JSEventListeners, Nodes, LayoutCount, RecalcStyleCount, LayoutDuration, RecalcStyleDuration, ScriptDuration, TaskDuration, JSHeapUsedSize, JSHeapTotalSize
Информация об этом материале очень скудна, и я продолжаю видеть, что люди ссылаются на page.queryObjects
как еще один способ найти утечки памяти. Но я не могу найти никакой информации о том, как использовать этот API и что искать.
Согласно документации кукловода:
page.metrics()
- возвращает: < Promise < Object > Объект, содержащий метрики как пары ключ/значение.
Timestamp
< число > Временная метка, когда была выбрана метрика метрики.Documents
< число > Количество документов на странице.Frames
< число > Число кадров на странице.JSEventListeners
< число > Число событий на странице.Nodes
< число > Число узлов DOM на странице.LayoutCount
< число > Общее количество полного или частичного макета страницы.RecalcStyleCount
< число > Общее количество перерасчетов стиля страницы.LayoutDuration
< число > Комбинированные длительности всех макетов страниц.RecalcStyleDuration
< число > Комбинированная продолжительность всех пересчетов стиля страницы.ScriptDuration
< номер > Совместимая продолжительность исполнения JavaScript.TaskDuration
< номер > Комбинированная продолжительность всех задач, выполняемых браузером.JSHeapUsedSize
< number > Используемый размер кучи JavaScript.JSHeapTotalSize
< число > Общий размер кучи JavaScript.ПРИМЕЧАНИЕ. Все временные метки находятся в монотонном времени: монотонно увеличивая время в секундах от произвольной точки в прошлом.
page.queryObjects(prototypeHandle)
prototypeHandle
< JSHandle > дескриптор прототипа объекта.- возвращает: < Promise < JSHandle >> Promise, которая разрешает дескриптор массиву объектов с этим прототипом.
Метод выполняет итерацию кучи JavaScript и находит все объекты с данным прототипом.
// Create a Map object await page.evaluate(() => window.map = new Map()); // Get a handle to the Map object prototype const mapPrototype = await page.evaluateHandle(() => Map.prototype); // Query all map instances into an array const mapInstances = await page.queryObjects(mapPrototype); // Count amount of map objects in heap const count = await page.evaluate(maps => maps.length, mapInstances); await mapInstances.dispose(); await mapPrototype.dispose();
Ярлык для page.mainFrame(). ExecuteContext(). QueryObjects (prototypeHandle).
Метод page.metrics()
возвращает результат протокола Chrome DevTools Performance.getMetrics
:
Performance.getMetrics
Получить текущие значения показателей времени выполнения.
ВОЗВРАТНЫЙ ОБЪЕКТ
metrics
массив Metric
- Текущие значения для метрик времени выполнения.
С другой стороны, протокол Chrome DevTools, который сопровождает метод page.queryObjects()
это Runtime.queryObjects
:
Runtime.queryObjects
ПАРАМЕТРЫ
prototypeObjectId
RemoteObjectId
- Идентификатор прототипа для возврата объектов.
- Строка
objectGroup
(необязательно)
- Символическое имя группы, которое можно использовать для вывода результатов.
ВОЗВРАТНЫЙ ОБЪЕКТ
objects
RemoteObject
- Массив с объектами.
Исходный код для page.matrics()
и page.queryObjects()
можно найти в GitHub.