Android 2.3.3
Eclipse Version: 3.7.0
LogCat
LogCat 報錯信息:
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): java.lang.OutOfMemoryError
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at android.database.CursorWindow.getString_native(Native Method)
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at android.database.CursorWindow.getString(CursorWindow.java:329)
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49)
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at com.taobao.htc.db.RecordDBHelper.query(RecordDBHelper.java:140)
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at com.taobao.htc.manage.RecordDBopt.get(RecordDBopt.java:80)
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at com.taobao.htc.manage.RecordMessage.sendAll(RecordMessage.java:55)
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at com.taobao.htc.Check.run(Check.java:456)
03-14 13:16:52.033: ERROR/AndroidRuntime(4399): at java.lang.Thread.run(Thread.java:1019)
同時有報錯信息
03-14 13:17:24.763: ERROR/CursorWindow(4399): need to grow: mSize = 1048576, size = 37, freeSpace() = 5, numRows = 6974
03-14 13:17:24.773: ERROR/CursorWindow(4399): not growing since there are already 6974 row(s), max size 1048576
03-14 13:17:24.804: ERROR/Cursor(4399): Failed allocating 37 bytes for text/blob at 6973,3
或
03-14 14:00:59.463: ERROR/CursorWindow(4399): need to grow: mSize = 1048576, size = 72, freeSpace() = 18, numRows = 6974
03-14 14:00:59.473: ERROR/CursorWindow(4399): not growing since there are already 6974 row(s), max size 1048576
03-14 14:00:59.543: ERROR/CursorWindow(4399): The row failed, so back out the new row accounting from allocRowSlot 6973
03-14 14:00:59.543: ERROR/Cursor(4399): Failed allocating fieldDir at startPos 0 row 6973
發生錯誤原因分析:
數據庫中Record表的數據較多,大概有兩萬條,從以上錯誤信息,可以看出,大約讀取到6974條時報錯。CursorWindow一次性打開數據太多,造成內存溢出。
解決辦法:
先查詢Record表的數據量,如果過大,做分批處理,每次處理5000條左右的數據,避免讀取更多數據造成內存溢出。