2012-12-24 73 views
0

所以我一直在努力與我的Android應用程序。我對Android編程相當陌生,併爲客戶提供應用程序。當時我爲三星的S2和S3等新設備編程。 現在我遇到了一個問題:垃圾收集。我讀過一些關於機制的文章,以及如何減少GC,但我認爲這不會有幫助。我希望有人能提示我如何照顧GC。有人可以告訴我我(如果可能的話)在我的應用程序中阻止GC嗎?

我的代碼執行以下操作:它從名爲vTiger的在線CRM中下載大量數據。它是一個動態系統,因此應用程序獲取大量鏈接的數據,而不僅僅是(例如)帶有用戶名和密碼的Users表。 現在進入JSON對象,我將它們分割出來,以便我可以使用所有數據,如下所示:對於每個模塊,獲取所有記錄。那麼這些記錄加起來大約是5000(現在,使用率還在增長)。

很多信息,所以我將所有的信息存儲到ArrayList和ArrayList中,這些信息是我用來存放信息的簡單對象。我記得我不只是將對象寫入數據庫,而是在數據庫重載時將它們保存在ArrayList中。所以我所做的就是將所有這些對象(大約5000 - 10000)保存在ArrayLists中,然後使用SQLite數據庫上的事務。這樣它運作良好。

但是, 在仿真器/舊設備上,我得到了很多GC_concurrent日誌記錄,這意味着我的代碼中有內存泄漏。我知道設備無法將所有這些對象都放在內存中,但您會如何處理這些問題?由於GC,較舊的設備無法通過「同步」功能進行處理。例如,我讓模擬器運行了幾個小時,但在同步過程中幾乎停滯了(非常非常慢)。

希望有人願意給我一些建議,如果可能的話。 在此先感謝!

+0

相當肯定,它是不可能完全關閉。此外,如果是這樣,它仍然不是一個好主意。 – NominSim

+0

「在仿真器/較舊的設備上,我收到了很多GC_concurrent日誌記錄,這意味着我的代碼中存在內存泄漏。」 - 根據定義,如果您收集垃圾,則該內存不會泄露。 「例如,我讓模擬器運行了幾個小時,但在同步過程中幾乎停滯了(非常非常非常慢)。」 - 而不是猜測,使用Traceview來確定*完全*你的性能問題來自哪裏。 – CommonsWare

+0

謝謝你的回覆。我看到很多來自ArrayList中堆疊對象的ArrayList分配。 @CommonsWare我前一段時間買了你的書,但還沒有找到時間去閱讀它。現在我將實現一個複選框,它提供了在初始啓動時不從服務器下載所有記錄的選項,並實現一個新的應用程序中的同步功能,它處理每100個記錄並重新使用分配 –

回答

0

如果你正在加載大量的數據,你會得到GC峯值。真的沒有辦法繞過它。唯一不會產生尖峯的方法是將數據分塊 - 將其分成更小的塊(可能是每個設備),並在加載更多塊之前處理它們。

0

不是一次請求服務中的所有數據,而是以塊的形式請求數據。這將防止內存填滿並強制小型GC。

+0

感謝回覆,我將實現一個開關,檢查設備是舊的還是新的,並且不會一次下載所有記錄,而是隻有必要的信息並在以後分批下載這些記錄! –

相關問題