一旦达到某个内存大小(泄漏),如何重新启动节点进程?

时间:2015-03-04 17:52:05

标签: node.js memory heroku memory-leaks

我在Node.js中有内存泄漏,我正在尝试找到它,但它目前部署到Heroku。我想现在有一些东西会在内存达到一定大小时重启过程(特别是因为我有几个dynos在运行)。

4 个答案:

答案 0 :(得分:1)

默认情况下,Heroku会在超过内存限制时重新启动Dyno。这将自动发生,因此您不必担心它。

您可能想要尝试做的一件事就是帮助您在生产中调试它,但是使用NewRelic addon

它们为您提供了一个很好的仪表板,您可以使用它来查看内存使用情况,查找瓶颈等。它非常有用,只需要一分钟即可完成设置(无需更改代码)。

答案 1 :(得分:1)

您可以使用节点应用程序指标(' appmetrics')模块执行此操作。

这提供了一个API来注册用于监视事件的回调,包括进程的内存使用和GC堆内存使用。

下面介绍如何为每个回调注册回调并设置阈值以对其执行操作:

var appmetrics = require('appmetrics');
var monitor = appmetrics.monitor();

var THRESHOLD = 100 * 1024 * 1024;

monitor.on('memory', function(memory) {
    if (memory.physical > THRESHOLD) {
        console.log('Process physical memory usage > ' + THRESHOLD);
    }
});

monitor.on('gc', function(gc) {
    if (gc.used > THRESHOLD) {
        console.log('Garbage collected used heap > ' + THRESHOLD);
    }
});

希望有所帮助!

答案 2 :(得分:0)

没有找到解决方案我创建了一个npm utli lib来做到这一点。请注意,它在Windows上不起作用。

它基于群集和状态npm libs。

http://github.com/DoryZi/memory_limiter

答案 3 :(得分:0)

尝试以下操作以停止服务器(使用永久性的库来重启Restart Node.js server programmatically):

        try {
    if (postRequest.length % 5 == 0) {
        const used = (process.memoryUsage().heapUsed / 1024 / 1024);
        const mem = Math.round(used * 100) / 100;
        if (mem >= 1024) { 
           //if(global.gc) global.gc(); 
           process.exit();}
        }
    } catch (e) {
        console.log("`Failed to exit`");
    }