Как обнаружить циклические ссылки в NodeJS? - PullRequest
1 голос
/ 31 января 2012

Я разрабатываю скрипт-демон в 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 строк, если кому-то захочется, я мог бы опубликоватьэто в пастбине.Или кто-нибудь может направить меня к хорошей документации по этой теме?

...