我正在使用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版本上。
我試過使用HTTPClient。它效率更高,但如果我鏈接了足夠的呼叫,它最終仍會耗盡內存。 –
你對響應數據做什麼?因爲如果你將它分配給一個變量並在某個地方使用它,它當然會留在內存中。也許你應該寫回應文件 –
你是否嘗試在Android Monitor中運行GC來釋放內存並保留它?也許在測試用例中沒有必要釋放內存? – miga