有了前面的理论基础,本篇从一个简单的内存泄漏例子开始,先掌握如何使用 Chrome 开发者工具进行内存泄漏分析。之后,讲解几个实际项目中遇到的不同类型的内存泄漏示例,让您学会如何识别和修复内存泄漏,之后再遇到类似问题能够从容面对。

一个简单的内存泄漏示例

这一个简单的示例,我们的目的主要是学习如何生成堆快照、分析内存泄漏及掌握 Chrome 开发者工具 Memory 面板各视图代表的含义。

准备一份产生内存泄漏的代码,它的逻辑很简单,触发 /trigger/memory/leak 接口后不断往外部对象 total 添加一个大数组对象,这会使得堆内存占用不断上涨,用不了多久,服务就会因为堆内存溢出而崩溃。

const http = require('http');
const v8 = require('v8');

const total = [];
http.createServer((req, res) => {
  if (req.url === '/metrics') {
    v8.writeHeapSnapshot();
    return res.end('The heap snapshot is generated successfully');
  }

  if (req.url === '/trigger/memory/leak') {
    setInterval(() => {
      total.push(new Array(5 * 1024 * 1024));
    }, 1000);
    return res.end('ok');
  }
}).listen(3000, () => console.log(`3000 port`));
Node 环境下打开 Chrome DevTools Memory

使用 --inspect 标志位运行 node 程序,访问 http://127.0.0.1:3000 打开检查器,看到如下图所示,左上角有个 Node.js Logo 图标按钮,点击后切换到 Memory 面板。

1d3b67eb9c49914e956dce2421809578.png
image.png

或在 Chrome 浏览器地址栏输入 chrome://inspect 打开 Memory 面板,如下图所示:

  • 点击 Take snapshot 按钮生成堆快照。

  • 点击 Load 按钮用于加载已生成的堆快照。

35327e8990b8dfdf7701a57b134452e4.png
Nodejs-DevTools-Memory.png

更多推荐