2014-11-05 35 views
0

我有一個應用程序需要在任何給定的時刻在一個隊列中存儲3〜1MB的字節數組。似乎什麼結束了發生的事情是,我得到這個消息ByteBuffers是一種在Android中存儲大於1MB數據的好方法嗎?

I/dalvikvm-heap﹕ Grow heap (frag case) to 4.827MB for 1058412-byte allocation 

然後我byte[]分配的大小爲0。

我已經嘗試設置在清單android:LargeHeap="true"但這仍然出現。

如果我使用ByteBuffers而不是byte[]是否可以存儲這3 byte[]對象沒有內存問題?

+1

你在重複使用這些字節數組嗎?或者你讓他們收集垃圾並試圖在晚些時候再分配它們? – CommonsWare 2014-11-05 01:15:42

+0

'字節[]被分配爲0的大小'不能發生,除非您指定大小爲零。它不會因內存不足而發生。 – EJP 2014-11-05 01:54:01

+0

是的,似乎Dalvik虛擬機有能力(至少在模擬器上)刪除一個太大的字節數組。很奇怪。 – benstpierre 2014-11-06 18:57:19

回答

0

從症狀(並沒有看到你的代碼),這聽起來像問題不是堆的總大小;而是因爲Android無法爲您的1MB陣列找到足夠大的連續空閒內存塊。考慮到Android設備的資源限制,這並不令人意外。如果我對發生的事情是正確的,那麼我很懷疑ByteBuffer將解決問題;它仍然需要分配一個足夠大的單個字節數組。

如果您的用例允許,您可以考慮將每個1MB的byte[]拆分爲更小的塊。 (有一個很好的博客文章here關於這樣做的一種方法。)系統將比以每個64KB大小找到16個可用內存塊的時間更容易,比找到1MB大小的單個塊。我已經成功地使用了這種方法(儘管使用了與上述鏈接不同的設計)來加載比2.5MB稍大的數據集,即使在比較老的設備(例如Android 2.2)上,它的總堆大小要小得多更新的設備。

相關問題