ノードアプリケーションでメモリリークが発生しているようです。私はそれを素早く構築しました。私の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) - >が漏れますメモリ
参考:http://stackoverflow.com/questions/5733665/how-to-prevent-memory-leaks-in-node-js –
'connectSync' :( – Raynos
あなたはString.Arrayを含むように修正されたStringを記述しますが、あなたのメモリスナップショットでもそれを指摘していますが、これを使用するコードや、String.Arrayを実際に作成したものは何も見つかりません。 – Matt