我似乎有我的節點應用程序內存泄漏。我很快就構建了它,並且我的JavaScript不太強大,所以這可能很容易。內存泄漏與socket.io + node.js
我已經做了一些堆轉儲,它是字符串'對象'?內存泄漏,每5分鐘約1MB。我擴展了String,實際上是String.Array?
堆棧:http://i.imgur.com/ZaBp0.png
#!/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;
});
}
}
不過內存泄露,但似乎只有這些條件:
- 從啓動時,有沒有客戶端 - >精細
- 第一客戶端連接 - >精細
- 第二客戶端(甚至與第一客戶端斷開和重新連接) - >泄漏存儲器
- 停止所有連接 - >精細
- 1新的連接(連接= 1) - >漏水內存
Informative:http://stackoverflow.com/questions/5733665/how-to-prevent-memory-leaks-in-node-js –
'connectSync' :( – Raynos
你提到你修改後的String來包含String.Array,甚至將我們指向你的內存快照,但我沒有看到你的代碼中會使用這個,也沒有看到你實際做了什麼來創建String.Array – Matt