Я разрабатываю скрипт-демон в NodeJS, который позволяет запрашивать (в нашем случае) SolR несколько раз одновременно.Чтобы быть более подробным, у нас есть большое приложение, написанное на PHP, и на некоторых страницах требуется больше запросов SolR.NodeJS был решением для нас, потому что с NodeJS я смог сделать несколько HTTP-запросов к нашему серверу SolR.Уже доказано, что это экономит много времени.
Дело в том, что все работает нормально и, как и ожидалось, но демон будет работать вечно.Это означает, что если есть утечка памяти, даже когда она действительно мала, это (большая) проблема.Я отлаживаю несколько дней и сократил использование памяти, просто попробовав ошибку.Но я не могу справиться с тем, что нет никакой утечки.
Я искал в Интернете, и я думаю, что круговые ссылки - моя проблема.У меня вопрос как их избежать?Иногда это выглядит невозможным для меня.Я пытался найти что-то для профилирования использования моей памяти в NodeJS, но https://github.com/dannycoates/v8-profiler, к сожалению, не работает.
Я из PHP-фона, поэтому разработка по событиям и т. Д. Для меня немного нова.Мне было интересно, если кто-нибудь может определить возможную утечку в следующем коде и объяснить мне, почему:
function ProxyHttpServer () {
this.httpServer = http.createServer();
this.configuration = new ProxyConfiguration();
var logWriter = new ProxyLogWriter();
/**
* This is the error event which occurs when the deamon is started
* and encounters that already 'something' is listening to the same port, and tries restarting
* for several times.
*/
ProxyHttpServer.prototype.serverError = function(e) {
this.configuration = new ProxyConfiguration();
if (e.code == 'EADDRINUSE') {
if(this.configuration.numRestart > 0) {
console.log('Address and/or port already in use, retrying ('
+ this.configuration.numRestart + ' attempts left)', 'WARNING');
this.configuration.numRestart -= 1;
setTimeout(function () {
self.httpServer.listen(this.configuration.port, this.configuration.host);
}, 1000);
} else {
console.log('I tried my best, but i\'m too tired now, check ps -fauxwww | grep http-query-daemon to '
+ 'see if this process is running already.', 'ERROR');
}
}
return ;
}
ProxyHttpServer.prototype.requestListener = function(request, response) {
this.proxyHttpClient = new ProxyHttpClient();
this.proxyHttpResponseWriter = new ProxyHttpResponseWriter();
this.proxyHttpClient.request = request;
this.proxyHttpClient.response = response;
this.proxyHttpClient.proxyHttpResponseWriter = this.proxyHttpResponseWriter;
this.proxyHttpResponseWriter.response = response;
this.proxyHttpClient.validate();
switch(this.proxyHttpClient.getRoute()) {
case 'stat' :
logWriter.writeLog(this.proxyHttpClient);
break;
case 'request' :
this.queries = this.proxyHttpClient.getQueries();
this.logger = new ProxyLogger();
for(var i in this.queries) {
this.httpRequest = new ProxyQueryRequest(this.queries[i], {
'client' : this.proxyHttpClient,
'responseWriter' : this.proxyHttpResponseWriter,
'queries' : this.queries,
'logger' : this.logger,
'finish' : function(responseXml, startTime, endTime, url, objectArguments) {
console.log('Request finished in ' + (endTime - startTime) + ' microsends', 'INFO');
objectArguments.responseWriter.addDocument(responseXml);
console.log(objectArguments.responseWriter.getNumDocs() + ' docs written, '
+ objectArguments.queries.length + ' queries', 'INFO');
objectArguments.logger.addRequest((endTime - startTime), url, startTime);
//fire writer if all requests are finished
if(objectArguments.responseWriter.getNumDocs() == objectArguments.queries.length) {
objectArguments.responseWriter.writeResponse();
}
responseXml = null;
startTime = null;
endTime = null;
url = null;
objectArguments = null;
return ;
},
'error' : function(message, objectArguments) {
objectArguments.responseWriter.writeError(message, true);
}
})
.execute();
}
break;
default :
this.proxyHttpResponseWriter.writeError('There is no valid route');
break;
}
this.proxyHttpClient = null;
this.proxyHttpResponseWriter = null;
this.queries = null;
this.logger = null;
this.httpRequest = null;
return ;
};
Я не могу опубликовать полный код, потому что это более 500 строк, если кому-то захочется, я мог бы опубликоватьэто в пастбине.Или кто-нибудь может направить меня к хорошей документации по этой теме?