Tag: 内存泄漏

用memwatch进一步查找内存泄漏

最近我用node.js开始了我的第一个项目,我可以肯定地说我很喜欢它。 非常强大的所有模块; 然而,似乎我有一个“轻微的”内存泄漏,导致我的服务器大约一个小时后(崩溃的99-100%的CPU)崩溃。 我一直在试图解决这个问题一段时间了。 幸运的是,经过一番search之后,我发现了一个名为memwatch的stream行工具。 我当然安装了模块,并开始logging我的服务器进程的内存使用情况/存储。 最后,在查看日志后,我发现可能的原因。 { "what": "String", "size_bytes": 9421368, "size": "8.98 mb", "+": 16635, "-": 533 } 当然,在30秒之内,这个小小的疯子提高了9mb(很不寻常)。 这是很好的,很高兴知道我的内存泄漏似乎是stringtypes,但我到底从哪里去? 有什么办法可以得到更准确的结果吗? 我查看了我的代码,但是在我的代码中确实没有可能像这样生长的string 。 有没有可能这个string实际上不是我的代码的一部分,更多的是节点或Socket.IO模块的一部分?

Node.js的性能和内存泄漏

我面对一些node.js记忆怪异,与反应prerendering应用程序。 这里是通过newrelic进行内存分析: 正如你所看到的那样 – 在一个小时内GC就会释放内存,达到1GB。 这是好的node.js(v0.12.x)或出了什么问题? PS我读了关于newrelic的内存泄漏,但closures它提供了相同的结果。

pm2显示1.2GB而heapdump显示80MB

我正在使用节点v0.12.7编写nodeJS应用程序。 我使用pm2 v0.14.7运行我的nodejs应用程序。 似乎我的应用程序中有内存泄漏,因为它从大约180MB反弹到24小时后的大约1GB。 我试图调查这个问题。 到目前为止,我发现了以下工具: memwatch-next heapdump节点检查器 与节点督察我发现一些CPU问题,我能够轻松地解决它们。 与memwatch-next和heapdump我试图得到应用程序内存的完整映射,问题如下: 在我的应用程序运行24小时后,pm2显示内存增加到1gb以上,当我使用这些工具创buildheapdump时,它会创build一个大约80MB的heapdump。 我的问题是..其余的在哪里? 如果应用程序内存大约是1GB,如何查看我的整个应用程序的内存映射以查找内存泄漏? 我错过了什么? 任何有关这个问题的信息将不胜感激。

有JavaScript内存泄漏recursion调用callback函数?

比方说,例如,您正在编写一个程序,等待队列中的消息,对其进行处理,然后等待下一条消息,并且这个消息永远持续下去。 在像C或Java这样的语言中,它看起来像这样: void processMessage() { while (true) { // waitForMessage blocks until the next message is received msg = waitForMessage(); // handle msg here } } 在Javascript(我使用node.js,顺便说一句),因为使用callback,它通常看起来像这样: function processMessage() { waitForMessage(function(msg) { // handle msg or error here processMessage(); }); } 我的担心是,你基本上有一个callback链recursion调用原来的function,这样做的开销可能会慢慢地消耗内存。 我猜这实际上不是一个问题,因为也许JavaScriptcallback独立存在于自己的堆栈上,而不是推到原始函数堆栈上? 有人向我解释了JavaScriptcallback和范围,并向我保证,在运行时间长达任意长时间的情况下,JavaScript代码不会耗尽内存,同时接收到任意大量的消息

当进程内存不足时删除大的Javascript对象

我是这种JavaScript的新手,所以我会给一个简短的解释: 我有一个在Nodejs中构build的Web抓取器,它收集(相当一部分)数据,使用Cheerio (基本上是jQuery for Node )创build一个对象,然后将其上传到mongoDB。 它工作得很好,除了在较大的网站。 似乎正在发生的是: 我给刮板一个网上商店的URL刮 节点转到该URL并从5,000 – 40,000个产品URL中检索任何地方进行刮取 对于这些新URL中的每一个,Node的request模块获取页面源,然后将数据加载到Cheerio 。 使用Cheerio我创build了一个代表产品的JS对象。 我将对象发送到MongoDB,并保存到我的数据库中。 正如我所说,这发生了成千上万的url,一旦我到达,比如说,10,000个url加载,我得到的节点错误。 最常见的是: Node: Fatal JS Error: Process out of memory 好的,这是实际的问题: 我认为这是因为节点的垃圾清理工作不正常。 例如,从所有40,000个URL中删除的request数据可能仍在内存中,或者至less有40,000个创build的JavaScript对象可能是。 也许这也是因为MongoDB连接是在会话开始时进行的,并且从不closures(我只是在所有产品完成后手动closures脚本)。 这是为了避免每次login新产品时打开/closures连接。 要真正确保它们被正确清理(一旦产品进入MongoDB,我不再使用它,可以从内存中删除),我可以/只需要简单地从内存中删除它,只需使用delete product ? 更重要的是(如果我删除了一个引用的对象是完全从内存中删除,或者我必须删除所有这些对象,我不清楚JS如何处理对象) 例如: var saveToDB = require ('./mongoDBFunction.js'); function getData(link){ request(link, function(data){ var $ = cheerio.load(data); createProduct($) }) } function createProduct($) var […]

node.js脚本和可能的内存泄漏

我正在编写一个node.js脚本,它从一个连接的套接字获取数据,并将其发送到另一个连接的套接字。 在testing过程中,我注意到如果在服务器发送大量数据的时候断开连接并重新连接客户端,则会发生内存泄漏。 以下是node.js代码。 var net = require('net'); var logServer = net.createServer(); var clientList = []; var clientIPList = []; var serverList = []; var serverIPList = []; var port = 6451; logServer.on('connection', function(client) { client.setEncoding('utf8'); client.once('data', function(data) { if (data[0].toString() == 'S') { var server = client; client = undefined; serverList.push(server); serverIPList.push(server.remoteAddress + ":" + […]

内存泄漏在Node.js集群的主进程中

问题解决了,只要从cluster.setupMaster删除silent属性,那么就不会有内存泄漏的问题,谁能告诉我为什么会这样? 我正在做一个由Node.js完成的项目,当我添加cluster以利用多CPU时,事情变得很奇怪。 我从主进程fork()工作进程,事情是我的工作进程工作得很好,没有内存泄漏问题,但主进程有它。 使用cluster的主进程代码是: var cluster = require('cluster'); var numCPU = require('os').cpus().length; cluster.setupMaster({ exec : '../worker/worker.js', silent : true }); if(cluster.isMaster){ for(var i=0; i< numCPU;i++){ cluster.fork(); } }

内存泄漏和NodeJS中的closures问题

当我们开始testing我们的NodeJS项目时,我们注意到了巨大的内存消耗。 这是由我们的项目内存泄漏造成的。 所以我们开始寻找所有可能产生内存泄漏的原因。 在stackoverflow上有这个问题的一些答案,但没有什么是和什么是内存泄漏任何straitforward文件。 我的问题: V8 GC上是否有文档以及它是如何工作的(详细信息)? 如何释放callback,以便GC可以收集它们? V8 GC是否收集了没有使用的variables,但是在它们下面有一个函数闭包? 例: var serviceChannel = require('./channel'); var dataRegistration = require('../data/registration'); function registerOnChannel(userID, channelID, callsuccess, callerror) { serviceChannel.findChannel(channelID, function (channel) { if (!channel) { callerror("Channel doesn' exists"); return; } dataRegistration.registerOnChannel(userID, channelID, function (registration) { if (!registration) { callerror("Registration doesn' exists"); return; } callsuccess("Registration successful"); }, function (error) […]

带有Socket.IO 1.0的NodeJS – 堆外的内存泄漏

我们一直在试图使用Socket.IO来部署一个小型的NodeJS应用程序,并且遇到了一个问题,那就是虽然应用程序的堆大小仍然可以接受,但是使用的总内存(rss)在大约2小时之后就会升至2GB以上,并继续上涨。 为了确保问题不在我们的代码中,我们除了初始化Socket IO之外,还部署了一个没有自定义逻辑的裸骨应用程序。 我们在相同的生产stream量下运行,并遇到同样的问题。 每10秒我们输出以下数据:rss内存使用情况,堆总数,堆数和连接数。 以下是一个输出示例: 523898880 199490816 123040352 2001 537059328 209774080 163828336 2011 538578944 206714368 150879848 2031 535252992 199514880 156743280 2041 542162944 200522752 145077944 2039 539652096 195387136 129486792 2055 551006208 206726400 170918304 2070 553254912 205706496 156447496 2071 550584320 198482944 154005496 2076 564363264 209810176 140442920 2095 561176576 201578752 123214232 2118 562487296 200546816 110638376 2112 572096512 […]

为什么node.js不释放内存?

我想了解如何在node.js上工作GC。 看来比v8引擎不释放内存。 我做了一个非常简单的脚本实现一个HTTP服务器,我保存每3秒的stream内存使用量。 var http = require('http'), fs = require('fs'), heapdump = require('heapdump'), memwatch = require('memwatch'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(8888); console.log('Server running on port 8888.'); memwatch.on('leak', function(info) { // look at info to find out about what might be leaking console.log('============= MEMWATCH ON LEAK ============\n',info) }); memwatch.on('stats', function(stats) { […]