node.js内存泄漏分析二

概述

在开发过程中,遇到了部分导致内存泄露的情况,本文主要是说明几种内存泄漏的问题,并简单分析一些关于内测泄漏分析的方法。

内存泄漏分析

1. 使用heapdump模块

模块介绍:https://github.com/bnoordhuis/node-heapdump

该模块主要是一个抓取当前内存的快照信息,包括所有的字符,对象和函数所占用内存的情况。

2. 分析原理

根据heapdump抓取的是当前内存的情况,那么如果存在内存泄漏的情况下,对在中间请求时刻抓取内存快照,然后再最后一个请求中抓取快照,那么再分析两者之间的区别,就可以看出内存泄漏的问题。

抓取方法可参考:

var times = 1;
var heapdump = require('heapdump');

/* server start */
global.app = HTTP.createServer(function(req, res) {
    var d = D.create();
    /* error catch */
    d.on('error', function(err) {
        console.error('error, server error', err.message, err.stack);
        serverError(res, req, err);
        d.dispose();
    });

    d.run(function() {
        ROUTER.router(res, req);
    });
    if(times == 1000 || times == 500){
        heapdump.writeSnapshot('/data/danhuang/' + Date.now() + '.heapsnapshot');
        }
    times++;
})

3. chrome工具分析

抓取到内存截屏以后,使用chrome的profile功能,load两个对应的headdump文件。load成功以后再使用profile中的comparsion功能,过程如下。

4. 对比分析优化

然后再经过两个截取的内存快照的函数以及对象的对比,就可以很清晰的看出哪些函数存在泄漏,然后再进行修复。

内存泄漏结论

在做的压测时发现存在泄漏,主要包含在两个部分

  1. log4js中的file.js使用数组无限保存对象
  2. settimeout执行导致内存暴涨,尽量不用使用settimeout
  3. protobuf未使用node_modules模块方法,导致每次build

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

webpack最简单的入门教程里bundle.js之运行单步调试的原理解析

您可以阅读我前一篇文章:Webpack 10分钟入门 来在本地运行一个Webpack的hello world项目。https://www.toutiao.com...

21040
来自专栏十月梦想

express框架模块导入与导出

经过3天nodejs的原生学习,今天转入到express框架学习.express与nodejs的关系类似于jquery和js关系,很大程度上方便了我们的开发!

9710
来自专栏极客生活

python 读取 mysql 中文乱码

这两天看了很多关于mysql中文乱码的问题,除了创建table的时候设置为utf8编码以及修改mysql配置文件的方法外,很少有人提关于python库中中文乱码...

17520
来自专栏随心DevOps

Python,Shell 和 三个标准文件

场景 使用 Python 执行 Shell 命令(或者脚本),有两种执行场景: 等待,直到命令执行完毕,一次性获取返回结果,做一些你想做的事情; 命令执行的同时...

42360
来自专栏python百例

29-文件对象基础操作

12020
来自专栏bboysoul

linux下如何编译带有math.h头文件的程序

环境是centos7 大概意思是没有定义sqrt函数 百度要自己去指定头文件去编译命令如下: gcc [文件名] -lm 参数解释 -l 指定程序链接...

10630
来自专栏H2Cloud

C++ FFLIB之FFXML: 极简化TinyXml 读取

摘要: XML是结构化的标记语言,经常被用来做配置文件。由于XML的具有非常强的自描述属性,使用XML的配置文件往往直观易懂。C++中解析XML已经有一些非常成...

37540
来自专栏kalifaの日々

前端绘图:js-sequence-diagrams安装及入门

1.js-sequence-diagrams的作用 将简单的文本行绘制成手绘风(或是简单的直线条)的流程图。优点是不需要复杂的数据结构。 ---- 这次做一个数...

44990
来自专栏开源优测

接口测试 | urllib篇 19 urllib基本示例

概述 本章就要就urllib中parse、request模块的重点API进行说明,也是以后大家最常用到的API。 本文不会列举所有的API。 本文以实例方式演示...

30390
来自专栏雪胖纸的玩蛇日常

老男孩Python全栈开发(92天全)视频教程 自学笔记08

20680

扫码关注云+社区

领取腾讯云代金券