我在库中有一些代码,过去泄漏严重,我想添加回归测试以避免将来出现这种情况。通过查看内存使用情况配置文件或Valgrind,我了解了如何手动查找内存泄漏,但是我无法为它们编写自动测试。
在运行我正在检查泄漏的操作后,我尝试使用global.gc()
后跟process.memoryUsage()
,然后反复执行此操作以尝试在操作次数和内存使用量之间建立线性关系,但似乎是内存使用数量中的噪音,这使得难以准确测量。
所以,我的问题是这样的:有没有一种有效的方法可以在Node中编写一个测试,当一个操作泄漏内存时它会一直传递,而当它没有泄漏内存时会失败?
我应该提到的一个问题是内存泄漏是在C ++插件中发生的,而且一些泄漏的内存不是由Node VM管理的,所以我在测量process.memoryUsage().rss
。
答案 0 :(得分:3)
自动化和记录信息以测试节点js中的内存泄漏。
有一个很棒的模块叫做memwatch-next。
npm install --save memwatch-next
添加到app.js:
const memwatch = require('memwatch-next');
// ...
memwatch.on('leak', (info) => {
// Some logging code...
console.error('Memory leak detected:\n', info);
});
这将允许您自动测量是否存在内存泄漏。
这方面的好工具是 Apache jMeter 。更多信息here。
如果您使用的是http,可以使用 jMeter 来测试应用程序的终点。
SOAK 测试是为了在较长时间内验证系统的稳定性和性能特性,当您查找内存泄漏,连接泄漏等时,它很有用。
如果您使用软件进行持续集成(例如 Jenkins ),在部署到生产之前,您可以让Jenkins工作为您执行此操作,它将使用测试后提供的参数测试应用程序将以太网部署应用程序或报告存在内存泄漏。 (取决于您的Jenkins作业配置)
希望它有所帮助,让我了解它的进展情况;
祝你好运,答案 1 :(得分:0)
鉴于某些任意程序,是否总能确定它是否会终止?暂停问题描述了这一点。请考虑以下程序:
function collatz(n){
if(n==1)
return;
if(n%2==0)
return collatz(n/2);
else
return collatz(3*n+1);
}
同样的想法可以应用于内存中的数据。并不总是能够识别出不再需要什么内存,因此可以进行垃圾收集。还有一种情况是程序被设计为在某些情况下消耗大量内存。唯一已知的选择就是像你所做的那样提出一些启发式算法,但它很可能会导致误报和否定。可能更容易确定泄漏的根本原因,以便纠正。