记一次内存泄漏处理
近期在检查服务器状态时,发现每个Node.js进程占用的内存大小在400-500M之间,根据平时的经验判断是代码中出现了内存泄漏导致,本文就记录这次内存泄漏问题的处理过程。
定位内存泄漏原因过程没有用到什么高难度技术,只是靠经验凭感觉找到的问题代码,简言之就是应用中有一个合成朋友圈分享海报功能,考虑前端canvas兼容性不够好以及该功能使用频次低,所以采用的是服务端合成,就是这个功能导致了应用出现内存泄漏。
合成方式
图片合成功能是借助sharp这个库实现的,原理是通过sharp提供的api往背景图上不断的叠加可变元素(头像、昵称、文案),原始代码比较长,定位问题的时候简化了处理代码,如下所示:
const fs = require('fs');
const _ = require('lodash');
const sharp = require('sharp');
let count = 0;
setInterval(() => {
if (++count % 20 === 0) {
console.log(count, _.mapValues(process.memoryUsage(), item => (item / 1024 / 1024).toFixed('4') + 'M'));
}
_makePost();
}, 300);
function _makePost() {
let text = `
<svg height="96" width="450">
<text x="0" y="24" font-size="26" fill="white"