0

我正在使用Appcelerator运行在Android上的内存泄漏。我正在重复进行HTTP GET调用,直到加载所有数据。这个调用大约发生了50次,总共大约40 MB的JSON。如果执行此操作,我看到内存使用率急剧上升。如果我执行这些GET堆大小(由Android设备监视器报告,根据官方Appcelerator文档检查内存的首选方法)将达到〜240 MB ,并且只要应用程序运行,它就会停留在那里。如果我不执行这些GET,它只使用大约50 MB。我不认为这是一个错误的堆阅读,因为如果我再次执行GET(从第1页)我用尽内存。Appcelerator Android HTTP中的内存泄漏?

我已经查看了代码,找不到任何明显的泄漏,例如将所有结果存储在全局变量或其他东西中。 HTTP响应是否被缓存在某处?

这是我的代码,仅供参考。 syncThings(1, 20)(消毒名称:))在启动过程中被调用。它又会调用帮助函数syncDocuments()。这是两个功能。除非你认为它可能是相关的,否则不要担心launchMainWindow(),但假定它没有清理。

function syncThings(page, itemsPerPage) { 
    var url = "the_url"; 

    console.log("Getting page " + page); 
    syncDocuments(url, 
     function(response) { 
      if (response.totalDocumentsInQuery == itemsPerPage) { 
       // More pages to get 
       setTimeout(function() { 
         syncThings(page + 1, itemsPerPage); 
        }, 1); 
      } else { 
       // This was the last page 
       launchMainWindow(); 
      } 
     }, 
     function(e) { 
      Ti.API.error('Default error callback called for syncThings;', e); 
      dispatcher.trigger('app:update:stop'); 
     }); 
} 


function syncDocuments(url, successCallback, errorCallback) { 
    new HTTPRequest({ 
     url: url, 
     method: 'GET', 
     headers: { 
      'Content-Type': 'application/json' 
     }, 
     timeout: 30000, 
     success: function (response) { 
      Ti.API.info('Success callback called for ' + url); 
      successCallback(response); 
     }, 
     error: function (error) { 
      errorCallback(error); 
     } 
    }).send(); 
} 

任何想法?我在这里做错了什么?

编辑:我正在使用Titanium SDK 6.0.1.GA.这发生在所有Android版本上。

+0

我试过使用HTTPClient。它效率更高,但如果我链接了足够的呼叫,它最终仍会耗尽内存。 –

+2

你对响应数据做什么?因为如果你将它分配给一个变量并在某个地方使用它,它当然会留在内存中。也许你应该写回应文件 –

+0

你是否尝试在Android Monitor中运行GC来释放内存并保留它?也许在测试用例中没有必要释放内存? – miga

回答