NodeJs内存快照分析

news2024/11/28 13:38:57
(头等人,有本事,没脾气;二等人,有本事,有脾气;末等人,没本事,大脾气。——南怀瑾)

在这里插入图片描述

NodeJs内存分析的必要性

回顾过去,我们排查web应用问题的途径通常是一下几种

  • 有显式异常的情况下(比如前端报错或者后端接口异常等),可以直接定位前端模块,确认不是前端的问题,则再排查对应的后端接口并根据异常的提示直接查找对应代码。这种问题的定位和排查速度最快最简单。该类问题通常是发版前的代码测试不完全导致,也是日常线上问题的主要排查途径
  • 没有显式异常,用户前端部分页面出现性能问题,比如加载时间长,后端接口请求时间长等。通常这类问题是在产品某个版本发布后造成,确认不是前端的问题,则将部分超时的接口发给后端,后端先可以快速定位到这几个接口,排查代码问题。该类问题通常在测试阶段很难发现,也是常见的线上类问题
  • 没有显式异常,用户也没有反馈问题,但后端服务得内存持续上升,无法定位到具体的接口,查看最近发版的代码也没有问题,那么该问题就是典型的内存泄漏,需要借助专业的工具和可视化来解决

针对第三种情况,我们无法快速的定位到问题代码,但可以借助排查工具,head-dump和chrom的memory等一起分析内存使用情况,排查内存空间占用大的对象,再利用该对象定位业务代码进行排查

head-dump

模拟数据泄漏代码

模拟一个后端服务内存泄漏场景,初始化全局变量customGlobalList,每次访问接口都向该数组添加100w个数字,随着接口访问频次的增加,该数组的容量也随之增加,从而造成内存泄漏的问题

import { Injectable } from "@nestjs/common";

const customGlobalList = [];

@Injectable()
export class AppService {

  constructor(
  ) { }

  getNestCli () {
    for (let index = 0; index < 1000000; index++) {
      customGlobalList.push(index);
    }
  }
}

添加内存快照打印代码

通过接口或者定时器触发,为了简单起见,我在这里通过接口触发

import { Injectable } from "@nestjs/common";
import * as heapdump from "heapdump";

const customGlobalList = [];

@Injectable()
export class AppService {

  constructor(
  ) { }

  getNestCli () {
    for (let index = 0; index < 1000000; index++) {
      customGlobalList.push(index);
    }
  }
  getHead () {
    console.log('fileName', `${__dirname}/${new Date().valueOf()}.heapsnapshot`);
    const fileName = `${__dirname}/${new Date().valueOf()}.heapsnapshot`;
    heapdump.writeSnapshot(fileName);
  }
}

通过chrom memory进行分析

我们分别打印两次快照,一次是服务刚启动时打印,一次是访问多次内存泄漏接口时打印

加载内存快照

打开chrom控制台,选择memory。左侧是已经加载好的内存快照,其中192mb的是有内存泄漏问题的,13.4m的是服务刚启动时的快照。
在这里插入图片描述
在这里插入图片描述

快照分析类型

Summary

按照对象列表排列,可以根据排序快速定位占用内存大的对象。

Shallow Size

对象自身占用的内存大小

Retained Size

对象被回收后可释放的内存大小

在这里插入图片描述
通过队Retained Size排序,我们发现array数组中的对象占据了94%的内存空间,
在这里插入图片描述
我们展开数组列表,查看下方的对象信息,就能够找到customGlobalList了

Comparison

通过对比两个快照来快速获悉以下信息

  • New - Comparison 特有 - 新增项
  • Deleted - Comparison 特有 - 删除项
  • Delta - Comparison 特有 - 增量
  • Alloc. Size - Comparison 特有 - 内存分配大小
  • Freed Size - Comparison 特有 - 释放大小
  • Size Delta - Comparison 特有 - 内存增量

在这里插入图片描述

Containment

查看内存内容。更适合查看对象结构,有助于分析对象的引用情况。适用于分析闭包以及深入分析对象
在这里插入图片描述

Statistics

统计视图,快速获悉各数据结构的内存占比
在这里插入图片描述

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

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

相关文章

36岁大龄程序员全职接单三个月的感触

36岁大龄程序员&#xff0c;原以为逃过35岁危机&#xff0c;没想到在年前被优化&#xff0c;拿了N2&#xff0c;12w薪资后&#xff0c;我开始了全职接单的道路。现在每个月平均收入有个20K&#xff0c;一路走来挺有感触的&#xff0c;把自己的经验分享给大家。 赚钱&#xff0…

【Jmeter】生成html格式接口自动化测试报告

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…

Android13蓝牙 停用绝对音量功能

Android13蓝牙 停用绝对音量功能 文章目录 Android13蓝牙 停用绝对音量功能一、前言二、代码实现分析过程1、查看SettingsLib源码资源2、查看原生Setitntgs 相关字符&#xff08;1&#xff09;xml 布局文件中的显示&#xff08;2&#xff09; java 代码文件中的控制串口上控制&…

Vue注册界面精美模板分享

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供vue组件之注册组件源码…

硬件软件【部署】

开发板和主机 1.功能不同&#xff1a;帮助开发者进行嵌入式系统的开发和调试&#xff0c;具有较强的硬件拓展能力&#xff0c;可以连接各种传感器/执行器等外设。主机为满足一般的计算需求而设计&#xff0c;具备更强的计算和图形处理能力。 2.架构不同&#xff1a;开发板通常…

解决CentOS7用户管理报错问题:密码设为Aa12345@时报错,为什么Bji230309@可以而Aa12345@不行?

场景&#xff1a; 早上博友(CSDN博客朋友)给我发私信&#xff0c;问了一个问题&#xff1a; CentOS7上面运行的项目&#xff0c;在用户管理添加新用户时&#xff0c;密码设置成Aa12345时&#xff0c;会报错&#xff1a;Cannot read property message of undefined。查看/etc/…

【Apache 配置与应用】

目录 一、构建虚拟 Web 主机httpd服务支持的虚拟主机类型包括以下三种 二、基于域名的虚拟主机1&#xff0e;为虚拟主机提供域名解析2.为虚拟主机准备网页文档3.添加虚拟主机配置4.设置访问控制5.加载独立的配置文件6.在客户机中访问虚拟 Web 主机 三、基于IP地址的虚拟主机四、…

QSettings Class

QSettings类 QSettings类公共类型&#xff08;枚举&#xff09;公有成员函数静态成员函数函数作用这个类写文件的特征 QSettings类 QSettings类提供持久的独立于平台的应用程序设置。 头文件:#include< QSettings >qmake:QT core继承&#xff08;父&#xff09;:QObje…

Springboot +spring security,认证方式---实现HTTP摘要认证

一.简介 这篇文章来学习下security的认证方式其中的HTTP摘要认证 二.Spring Security的认证方式 2.1什么是认证 认证: 就是用来判断系统中是否存在某用户&#xff0c;并判断该用户的身份是否合法的过程&#xff0c;解决的其实是用户登录的问题。认证的存在&#xff0c;是为…

JavaScript高级三、深入面向对象

零、文章目录 JavaScript高级三、深入面向对象 1、编程思想 &#xff08;1&#xff09;面向过程介绍 面向过程&#xff1a;分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用就可以了。 &#xff08;2&…

Android 架构模式

1.三个基本架构 ①MVC&#xff08;Model-View-Controller&#xff09; Model&#xff1a;代表数据模型&#xff0c;管理数据状态。 View&#xff1a;视图&#xff0c;即呈现给用户的UI&#xff0c;包括布局文件及Activity。 Controller&#xff1a;控制者&#xff0c;负责处…

KubeVirt技术介绍及实验部署

虚拟化简介 在云计算发展中&#xff0c;有两类虚拟化平台&#xff1a; openstack&#xff08;iaas&#xff09;&#xff1a;关注于资源的利用&#xff0c;虚拟机的计算&#xff0c;网络和存储Kubernetes&#xff08;pass&#xff09;&#xff1a;关注容器的编排调度&#xff…

设计模式之~代码模式

描述&#xff1a; 代理模式&#xff08;Proxy&#xff09;&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。 结构图&#xff1a; 优点: 代理模式能将代理对象与真实被调用的目标对象分离 一定程度上降低了系统的耦合度&#xff0c;扩展性好 可以起到保护目标对象…

发明专利公开 -- 一种基于 JSON 文件 + Http Header 的支持多项目、多分支、多人协同的 Api Mock/代理 工具

现阶段主流的前后端分离的开发模式下&#xff1a;前后端采用并行开发方式&#xff0c;在前端开发过程中通常需要依附于共同约定的接口格式及数据。 该过程是一个并行过程&#xff0c;因此 Api Mock 模拟接口的返回变成了必要。同时&#xff0c;联调过程中&#xff0c;修改后端…

目标检测笔记(九):详细介绍并实现-如何可视化深度学习中每层特征层的网络训练情况

文章目录 为什么要解析特征层如何可视化特征层可视化结果如何 ❤️ &#x1f9e1; &#x1f49b; &#x1f49a; &#x1f499; &#x1f49c; &#x1f5a4; &#x1f90d; &#x1f90e; &#x1f494; ❣️ &#x1f495; &#x1f49e; &#x1f493; &#x1f497; &#…

随笔-学会和解

上周六&#xff0c;媳妇儿去加班&#xff0c;回到家已经是晚上8点多了。当天的雨淅沥沥地下了一天&#xff0c;气温很低。 看着她情绪不是很高&#xff0c;也没说啥&#xff0c;赶紧安排吃饭。 我&#xff1a;咋的啦&#xff0c;项目不顺利&#xff1f; 她&#xff1a;还行吧…

【深度学习】【人脸检测模型】SCRFD模型的训练与部署实战

文章目录 Linux安装环境pythoninsightface环境 训练数据集准备todo 训练 Linux安装环境 python 我的cuda版本11.6&#xff1a; $ nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Tue_Mar__8_18:18:20_PST_2022…

gitlab占用内存太大了如何解决?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号雄雄的小课堂 现在是&#xff1a;2023年5月30日16:58:15 最近在家里自己搞了个服务器&#xff0c;因为这台机器都不用了&#xff0c;从朋友那拿过来&#xff0c;就当服务器用了&#xff0c;看了下&#xff0c;比云服…

python基本操作2(速通版)

关于字符串的基本操作&#xff0c;以实例为主。 目录 一、字符串基本操作 1.基本字符串定义 2.字符串遍历 3字符串切片 二、字符串的常用方法 1.find函数 2.replace函数 3.count函数 4.分割和连接类的函数 5.字符串判断函数 6.去除字符串的 三、元组 1.元组的基本操…

离散数学-集合论

数学基础-离散数学-集合论 集合论是现代各科数学的基础&#xff0c;它起源于十六世纪末期的数集的研究。直到1876-1883年&#xff0c;康托尔发表了一系列有关集合论的文章&#xff0c;奠定了集合论的基础。1904-1908年&#xff0c;策墨罗(Zermelo)提出了集合论的公理系统&…