Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 一旦节点进程达到某个内存大小(泄漏),如何重新启动它?_Node.js_Memory_Heroku_Memory Leaks - Fatal编程技术网

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

Node.js 一旦节点进程达到某个内存大小(泄漏),如何重新启动它?,node.js,memory,heroku,memory-leaks,Node.js,Memory,Heroku,Memory Leaks,我在Node.js中有一个内存泄漏,我正在努力查找它,但它目前已部署到Heroku。我希望当前有一些东西,一旦进程在内存中达到一定大小,就可以重新启动进程(特别是因为我有一些dyno正在运行)。没有找到解决方案,我创建了一个npm utli库来实现这一点。但请注意,它在windows上不起作用 它基于集群和状态npm库 默认情况下,如果Dyno超出内存限制,Heroku将重新启动Dyno。这会自动发生,所以你不必担心 但是,您可能希望尝试做一件事来帮助您在生产中调试它,那就是使用 它们为您提供了

我在Node.js中有一个内存泄漏,我正在努力查找它,但它目前已部署到Heroku。我希望当前有一些东西,一旦进程在内存中达到一定大小,就可以重新启动进程(特别是因为我有一些dyno正在运行)。

没有找到解决方案,我创建了一个npm utli库来实现这一点。但请注意,它在windows上不起作用

它基于集群和状态npm库


默认情况下,如果Dyno超出内存限制,Heroku将重新启动Dyno。这会自动发生,所以你不必担心

但是,您可能希望尝试做一件事来帮助您在生产中调试它,那就是使用


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

您是否使用PM2运行应用程序?如果是,有一个很好的配置选项可以满足您的需要,叫做
max\u memory\u restart


您可以使用节点应用程序度量(“”)模块完成此操作

这提供了一个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);
    }
});

希望有帮助

尝试此操作以停止服务器(使用永久库重新启动):


我很好奇为什么这个被否决了至少解释一下,我分享这个代码和问题是为了帮助其他陷入同样问题的人不是因为我需要答案,因为我已经自己解决了。我一直在使用NewRelic,但heroku似乎并不总是重新启动,而且,当你的内存达到最大值时,整个应用程序的运行速度会急剧下降,因此值得提前重启应用程序,通过这种方式,您可以确保如果您有多个dyno,它将平稳运行。此外,当您达到高内存使用率时,您可能会进行大量交换。应用程序可用的最大RAM量取决于您使用的dyno大小。如果:1X dyno的内存使用量达到2.5GB,是其配额的五倍,dyno管理器将重新启动dyno并记录R15错误。2X dyno达到5GB,是其配额的五倍。PX dyno达到12GB,是其配额的两倍。使用太小的dyno大小可能会导致持续的内存交换,这将降低应用程序的性能。这是正确的,我在回答中没有提到,以免混淆任何人。但基本上,Heroku允许您在重启dyno之前将配额超出2.5倍,迫使您使用swap。在几乎所有情况下,这正是你想要的。你不想放弃用户请求,最好只是把它们慢一点。一旦dyno重新启动,一切都将恢复正常。我在配置文件中使用了相同的功能。但它并不适用。我给的限制是50米。当检查状态时,它已经变为90多MBs。你能解释一下吗?
        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`");
    }