【问题标题】:ROOM OutOfMemoryError R(OOM)ROOM OutOfMemoryError R(OOM)
【发布时间】:2017-11-25 00:48:02
【问题描述】:

我在我的游戏控制台中看到了这些错误。有人知道如何最好地处理房间中的 OOM 错误吗?

java.lang.OutOfMemoryError: 
  at android.database.CursorWindow.nativeGetString (Native Method)
  at android.database.CursorWindow.getString (CursorWindow.java:451)
  at android.database.AbstractWindowedCursor.getString (AbstractWindowedCursor.java:51)
  at org.walleth.data.transactions.TransactionDAO_Impl$8.compute (TransactionDAO_Impl.java:1272)
  at org.walleth.data.transactions.TransactionDAO_Impl$8.compute (TransactionDAO_Impl.java:1212)
  at android.arch.lifecycle.ComputableLiveData$2.run (ComputableLiveData.java:87)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
  at java.lang.Thread.run (Thread.java:762)

【问题讨论】:

  • 除非String 真的很大,否则房间可能不是你的问题,而只是你崩溃的地方。 OOM 有两个触发器:请求太大的内存块(想想Bitmap)或由于某处泄漏而真正内存不足。在后一种情况下,您崩溃的地方恰好是您最终耗尽内存的地方,但不一定是泄漏的地方。您是否得到了这个崩溃日志的变体,它告诉您分配失败有多大?
  • 不幸的是,我没有崩溃日志的变体,在那里我看到了分配失败的大小。但这可能是一个巨大的字符串(在某些情况下数据字段可能很大) - 有什么办法可以捕捉到这个 OOM 并忽略这个项目(很可能是合同部署,无论如何我对此不感兴趣)
  • 您没有办法很好地捕获该特定异常,因为它发生在您无法控制的后台线程上,并且 LiveData 不会传播异常。考虑不要让你的 DAO 返回 LiveData,而是使用 RxJava 类型。或者,让这个查询在 DAO 中同步,并安排在您自己的某个后台线程上调用 @Query 方法。
  • 感谢您的建议!将首先尝试使用 paging-lib:github.com/walleth/walleth/issues/110 - 也许这也是加载的事务量 - 在某些情况下可能很多。
  • 再想一想,它可能对内存不足错误没有帮助,因为它会执行相同的操作,但如果查询太大,它只会更加一致。如果您要更新任何内容,它只能在查询期间出现错误的情况下帮助您提高数据准确性。这些是最麻烦的错误,因为您似乎甚至无法找到哪个查询是错误的。

标签: android out-of-memory android-room android-livedata


【解决方案1】:

您是否一次传输大量数据?

如果是你填写的列表,你可以懒惰地填写,例如 100 x 100。

此外,如果您从数据库中获得的响应有很多列,SELECT 就是您使用的那些。

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2013-05-01
    • 2017-11-20
    • 2017-12-07
    • 2015-10-11
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多