我的Node.js应用程序似乎有内存泄漏。我快速地构建了它,而且我的JavaScript不太强,所以这可能很容易。
我在上面做了一些堆转储,这是字符串object吗?内存泄漏,速度约每5分钟1MB。我展开了字符串,它实际上是String.Array?
堆堆栈:

#!/usr/local/bin/node
var port = 8081;
var io = require('socket.io').listen(port),
sys = require('sys'),
daemon = require('daemon'),
mysql = require('mysql-libmysqlclient');
var updateq = "SELECT 1=1";
var countq = "SELECT 2=2";
io.set('log level', 2);
process.on('uncaughtException', function(err) {
console.log(err);
});
var connections = 0;
var conn = mysql.createConnectionSync();
dbconnect();
io.sockets.on('connection', function(client){
connections++;
client.on('disconnect', function(){ connections--; })
});
process.on('exit', function () {
console.log('Exiting');
dbdisconnect();
});
function dbdisconnect() {
conn.closeSync();
}
function dbconnect() {
conn.connectSync('leet.hacker.org','user','password');
}
function update() {
if (connections == 0)
return;
conn.query(updateq, function (err, res) {
if (err) {
dbdisconnect();
dbconnect();
return;
}
res.fetchAll(function (err, rows) {
if (err) {
throw err;
}
io.sockets.json.send(rows);
});
});
}
function totals() {
if (connections == 0)
return;
conn.query(countq, function (err, res) {
if (err) {
// Chances are that the server has just disconnected, lets try reconnecting
dbdisconnect();
dbconnect();
throw err;
}
res.fetchAll(function (err, rows) {
if (err) {
throw err;
}
io.sockets.json.send(rows);
});
});
}
setInterval(update, 250);
setInterval(totals,1000);
setInterval(function() {
console.log("Number of connections: " + connections);
},1800000);
daemon.daemonize('/var/log/epiclog.log', '/var/run/mything.pid', function (err, pid) {
// We are now in the daemon process
if (err) return sys.puts('Error starting daemon: ' + err);
sys.puts('Daemon started successfully with pid: ' + pid);
});当前版本
function totals() {
if (connections > 0)
{
var q = "SELECT query FROM table";
db.query(q, function (err, results, fields) {
if (err) {
console.error(err);
return false;
}
for (var row in results)
{
io.sockets.send("{ ID: '" + results[row].ID + "', event: '" + results[row].event + "', free: '" + results[row].free + "', total: '" + results[row].total + "', state: '" + results[row]$
row = null;
}
results = null;
fields = null;
err = null;
q = null;
});
}
}内存仍在泄漏,但似乎只有在以下情况下:
发布于 2011-07-07 11:02:04
帮你自己一个忙,使用node-mysql,它是一个纯javascript客户端,而且速度很快。除此之外,您应该在工作时使用异步代码来阻止IO被阻塞。在这里使用async库将对您有所帮助。它有瀑布回调的代码,其中包括传递。
至于您的内存泄漏,它可能不是socket.io,虽然我已经几个月没有使用它了,但我已经有数千个并发连接,没有泄漏内存,我的代码也不是最好的。
然而,有两件事。首先,您的代码是无法读取的。我建议适当地格式化您的代码(我为每个缩进使用两个空格,但有些人使用四个)。其次,每半小时打印一次连接数似乎有点傻,因为您可以这样做:
setInterval(function() {
process.stdout.write('Current connections: ' + connections + ' \r');
}, 1000);\r将导致该行被读回行的开头,并覆盖其中的字符,这将取代行,而不会产生大量的回滚。如果您选择将调试详细信息放在日志记录中,这将有助于调试。
您还可以使用process.memoryUsage()快速检查内存使用情况(或节点认为使用了多少)。
发布于 2012-05-02 19:46:32
这是否与客户端断开时未正确清除连接的客户端数组有关?数组值被设置为NULL,而不是从数组中删除。
https://stackoverflow.com/questions/6470872
复制相似问题