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

How can I restart a node process once it reaches a certain memory size (leak)?

我在 Node.js 中有内存泄漏,我正在努力寻找它,但它目前已部署到 Heroku。我现在想要一些东西,一旦它在内存中达到一定大小就会重新启动这个过程(特别是因为我有一些测功机运行)。

找不到解决方案我创建了一个 npm utli 库来执行此操作。请注意,它不适用于 windows。

它基于集群和状态 npm 库。

http://github.com/DoryZi/memory_limiter

默认情况下,如果超过内存限制,Heroku 将重启您的 Dyno。这会自动发生,因此您真的不需要担心。

然而,您可能想尝试做一件事来帮助您在生产中调试它,那就是使用 NewRelic addon.

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

您是否使用 PM2 运行 您的应用程序?如果是,那么有一个很好的配置选项可以满足您的需要,称为 max_memory_restart.

http://pm2.keymetrics.io/docs/usage/monitoring/#max-memory-restart

您可以使用节点应用程序指标('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);
    }
});

希望对您有所帮助!

试试这个来停止服务器(使用 forever 库重新启动 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`");
    }