NodeJs - Chrome内存分析工具使用

NodeJs - Chrome内存分析工具使用

  • 一. 前期准备
  • 二. Chrome 内存分析工具使用
    • 2.1 查看快照
    • 2.2 使用案例

一. 前期准备

我们下载好相关依赖:

npm i v8-profiler-next

测试代码:

const v8Profiler = require('v8-profiler-next')
const fs = require('fs')function createArray () {const arr = [];for (let i = 0; i < 100000; i++) {arr.push({ index: i, value: `value-${i}` });}return arr;
}
let leakArr = [];function run () {createArray();createArray();createArray();console.log('Arrays created');setInterval(() => {console.log('Interval');// 模拟内存泄漏,将一个对象添加到数组中for (let i = 0; i < 100000; i++) {leakArr.push({ index: i, value: `value-${i}` });}}, 1000);
}run();const snapshot = v8Profiler.takeSnapshot();
snapshot.export((err, result) => {fs.promises.writeFile(`${Date.now()}.heapsnapshot`, result);snapshot.delete()
})setInterval(() => {const snapshot = v8Profiler.takeSnapshot();snapshot.export((err, result) => {fs.promises.writeFile(`${Date.now()}.heapsnapshot`, result);snapshot.delete()})
}, 10000);

运行之后,当前目录会生成下面多个snapshot文件(运行时间久一点,15秒左右就可以):
在这里插入图片描述

二. Chrome 内存分析工具使用

Chrome内存分析工具中,对于视图的查看分为4种:
在这里插入图片描述

2.1 查看快照

快照的查看种类还有:

  • Summary 视图:会显示按构造函数名称分组的对象。使用它可以根据按构造函数名称分组的类型找出对象(及其内存用量)。它对于跟踪 DOM 泄露特别有用。
  • 比较视图(重点):会显示两个快照之间的差异。可使用它来比较操作前后的两个(或更多)内存快照。通过检查已释放内存中的增量和引用计数,您可以确认是否存在内存泄漏及其原因。
  • 包含视图:允许探索堆内容。它可让您更好地查看对象结构,有助于分析全局命名空间 (window) 中引用的对象,从而找出导致其存在的原因。您可以使用它分析闭包并在较低级别深入了解您的对象。
  • 支配项视图:会显示支配项树,可用于查找累积点。 此视图有助于确认是否有对对象的意外引用仍然保留,以及删除/垃圾回收是否确实在正常运行。

2.2 使用案例

浏览器输入:chrome://inspect/#devices,如图,点击Open dedicated DevTools for Node
在这里插入图片描述
点击之后出现相关弹框,我们点击加载按钮,把我们生成的两个dump文件加载进去:
在这里插入图片描述
加载好后,如图:
在这里插入图片描述

一般内存泄漏,我们重点关注是否存在:只有新增对象,却没有删除项的类别。 如图:
在这里插入图片描述

这里我们看到Object对象几乎都是新增,新增了一百万个,那么几乎可以确认这些对象就是内存泄漏的点了,我们展开来看下它的内容有啥:
在这里插入图片描述

就是我们循环里面不停地给数组中增加的对象:
在这里插入图片描述
因为这个数组,它在setInterval这个函数中被引用,所以它永远不会被释放,从而模拟出内存泄漏甚至最终OOM的情形。

相关名词解释:

  • Constructor:构造函数,表示使用此构造函数创建的所有对象。
  • #New:表示在两个快照之间新创建的对象数量。这些对象在两个快照之间被分配了内存。
  • #Deleted:表示在两个快照之间被删除的对象数量。这些对象在两个快照之间释放了内存。
  • #Delta:表示在两个快照之间的内存变化量。它是新创建对象的内存减去已删除对象的内存。
  • Distance表示对象与根对象之间的距离。根对象是内存中的起点,而距离是指从根对象到特定对象的路径长度。较大的距离值表示对象与根对象之间的引用链更长。
  • Shallow Size:表示对象本身占用的内存大小不包括对象引用的其他对象的内存。
  • Retained Size:表示对象及其所有可达对象占用的内存大小。它包括对象本身的内存大小以及对象引用的其他对象的内存大小。
    Alloc Size:表示对象在内存中分配的总大小,包括对象本身的大小以及对象引用的其他对象的大小。这个值是对象在内存中实际占用的大小。
  • Freed Size:表示在两个快照之间释放的对象的总大小。这些对象在两个快照之间被删除或释放了内存。
  • Self Size:表示对象本身占用的内存大小,不包括对象引用的其他对象的内存。与Shallow Size类似,Self Size更常用于表示对象的实际占用大小。
  • Retainers:表示引用特定对象的其他对象的数量。这些对象保持对特定对象的引用,因此会阻止特定对象被垃圾回收。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听GPT 讲Rust源代码--library/alloc(2)

File: rust/library/alloc/src/vec/mod.rs 在Rust源代码中&#xff0c;rust/library/alloc/src/vec/mod.rs这个文件是Rust标准库中的Vec类型的实现文件。Vec是一个动态大小的数组类型&#xff0c;在内存中以连续的方式存储其元素。 具体来说&#xff0c;mod.rs文件中定义了以下…

Elasticsearch:使用 ELSER v2 文本扩展进行语义搜索

Elastic 提供了一个强大的 ELSER 供我们进行语义搜索。ELSER 是一种稀疏向量的搜索方法。我们无需对它做任何的微调及训练。它是一种 out-of-domain 的模型。目前它仅对英文进行支持。希望将来它能对其它的语言支持的更好。更多关于 ELSER 的知识&#xff0c;请参阅文章 “Elas…

MySql——1146 - Table‘mysql.proc‘doesn‘t exit是这个

项目场景&#xff1a; 做自己的小项目需要连接mysql数据库 问题描述 点击数据库时报错 1146 - Table’mysql.proc’doesn’t exit 原因分析&#xff1a; 误删原生的mysql数据库 解决方案&#xff1a; 重新安装装部署mysql就好了 注意不要轻易删除原生的东西

day55 算法训练|动态规划part15

392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的…

react学习第一天

脚手架的创建 1.创建环境变量 npm init -y 2.创建node-modules npm add -D create-react-app 3.创建脚手架 npx create-react-app react-demo1 报错一号 报错原因&#xff1a;node版本太低 解决&#xff1a;升级版本 nvm install 14.0.0 nvm use 14.0.0 报错二号 报错原因&…

牛客网SQL训练5—SQL大厂面试真题

文章目录 一、某音短视频1.各个视频的平均完播率2.平均播放进度大于60%的视频类别3.每类视频近一个月的转发量/率4.每个创作者每月的涨粉率及截止当前的总粉丝量5.国庆期间每类视频点赞量和转发量6.近一个月发布的视频中热度最高的top3视频 二、用户增长场景&#xff08;某度信…

git上传代码到github远程仓库

1、添加SSH公钥 为了把本地的仓库传到github&#xff0c;还需要配置ssh key&#xff0c;说白了就是为了把本地的代码上传到github。 1、前置准备 本地需要安装git&#xff1a;Git - Downloads。安装成功后本地右键鼠标会多出一些git选项。 2、添加SSH Key 首先在本地创建s…

红队打靶练习:MISDIRECTION: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

Linux环境下OpenSSH升级到 OpenSSH_9.5p1(内置保姆级教程)

我最近在修复服务器的openssh漏洞的时候是服务器生产环境&#xff0c;自己在做的时候&#xff0c;就遇到的重启之后直接断掉ssh的连接&#xff0c;最后发现原因是没配置sshd_config的允许远程用户登录&#xff0c;因此&#xff0c;在此记录一下升级openssh的操作步骤&#xff0…

算法基础之能被整除的数

能被整除的数 核心思想&#xff1a; 容斥原理 总面积 1-23-4…. 总集合元素中个数 1-23-4…. #include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N 20;typedef long long LL;int p[N];int main(){int n,m;cin&…

十八、任务通知

1、前言 (1)所谓“任务通知”&#xff0c;可以反过来读"通知任务"。我们使用队列、信号量、事件组等等方法时&#xff0c;并不知道对方是谁。使用任务通知时&#xff0c;可以明确指定&#xff1a;通知哪个任务。 (2)使用队列、信号量、事件组时&#xff0c;我们都需…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷②

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第2套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第2套&#xff09; 模块…

Topics(动态路由)

Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列中。只不过Topic类型Exchange可以让队列在绑定路由时可以使用通配符。 *&#xff1a;匹配不多不少刚好一个单词。 #&#xff1a;匹配一个或多个词。 举例&#xff1a; audit.#可以匹配…

解密C++中的forward<int>(a)和forward<int >(a):你真的了解它们之间的区别吗?

一文看尽C中的forward完美转发 一、前言二、深入理解forward和完美转发三、对forward<int>(a)的解析四、对forward<int &&>(a)的解析五、forward<int>(a)和forward<int &&>(a)的区别总结 一、前言 完美转发在C中具有重要性&#xff0…

一文掌握Java注解之@SpringBootApplication知识文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Spring Cloud Gateway + Nacos 实现动态路由

1、maven 依赖 主要依赖 <!-- 网关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>案件差不多完整主要依赖 <!--Spring boot 依赖(微服务基…

fanout(扇出模型)

在广播的流程下&#xff0c;消息发送的流程如下&#xff1a; 可以有多个消费者。 每个消费者有自己的queue(队列)。 每个队列都要绑定到Exchange(交换机)。 生产者发送的消息&#xff0c;只能发送到交换机&#xff0c;交换机来决定要发给哪个队列&#xff0c;生产者也无法决…

oracle物化视图

物化视图定义 视图是一个虚拟表&#xff08;也可以认为是一条语句&#xff09;&#xff0c;基于它创建时指定的查询语句返回的结果集&#xff0c;每次访问它都会导致这个查询语句被执行一次&#xff0c;为了避免每次访问都执行这个查询&#xff0c;可以将这个查询结果集存储到…

【算法题】矩阵顺时针旋转90° (js)

力扣链接&#xff1a;https://leetcode.cn/problems/rotate-matrix-lcci/description/ 本人题解&#xff1a; /*** param {number[][]} matrix* return {void} Do not return anything, modify matrix in-place instead.*/ var rotate function (matrix) {const x matrix.le…

Spring高手之路-Spring事务的传播机制(行为、特性)

目录 含义 七种事务传播机制 1.REQUIRED&#xff08;默认&#xff09; 2.REQUIRES_NEW 3.SUPPORTS 4.NOT_SUPPORTED 5.MANDATORY 6.NEVER 7.NESTED 含义 Spring事务的传播机制是指在多个事务方法相互调用时&#xff0c;如何处理这些事务的传播行为。对应七种事务传播行为…