Android 5.0上的java.lang.OutOfMemoryError错误,由于16k分配时有5M可用。

5
我从Google Play收到了我的Android应用程序的以下奇怪崩溃报告(请注意分配量与可用空间之间的差异)-
java.lang.OutOfMemoryError: Failed to allocate a 16396 byte allocation with 5746272 free bytes and 111MB until OOM
    at com.android.internal.util.FastXmlSerializer.<init>(FastXmlSerializer.java:55)
    at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:183)
    at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:597)
    at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:51)
    at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:512)
    at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:533)
    at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:51)
    at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:455)
    at com.headuck.headuckblocker.bj.a(Unknown Source)
    at com.headuck.headuckblocker.UpdateService.e(Unknown Source)
    at com.headuck.headuckblocker.UpdateService.a(Unknown Source)
    at x.a.onHandleIntent(Unknown Source)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:145)
    at android.os.HandlerThread.run(HandlerThread.java:61)

我知道Stack Overflow上有许多关于OutOfMemoryError的问题,但似乎没有一个是由比可用空间小得多的字节分配引起的。
用户在使用Android 5.0上的Galaxy S5时报告说,在玩游戏时(无论哪个游戏)会发生这样的崩溃 - 我认为每当他/她使用另一个内存密集型应用程序并且我的应用程序的后台服务被调度运行时都会发生这种情况。作为Google Play报告,我没有其他获取更多详细信息的方法。
我的问题是,可能会导致这种情况发生,以及应用程序可以采取哪些措施来避免它?
一些背景(如果这方面相关):上述崩溃来自我的应用程序定期计划的后台服务,不涉及任何UI /位图。它所做的一切就是从服务器下载数据并更新数据库/状态。在比现代Android手机标准要少得多的RAM的5年旧机器上运行而没有任何问题,应该根据现代Android手机的标准非常轻便。上述错误实例发生在数据库更新和服务将更新的状态写入共享首选项之后的某个时间点。
编辑:刚刚阅读了与此问题发布后链接到的OutOfMemoryError in android on allocation 4Mb when 10Mb is free,但似乎可用空间可以在这种情况下如此分散是相当不可能的?是否有其他可能的原因?

https://github.com/facebook/fresco/issues/404 https://github.com/facebook/fresco/issues/159 - Chaudhary Amar
2个回答

0

我曾经遇到过类似的问题。

  1. 在res/文件夹中创建一个名为drawable-nodpi的新文件夹
  2. 将/drawable文件夹中的所有“图像”移动到/drawable-nodpi文件夹中

希望这能帮助到某些人 :)


谢谢,也许对其他人有用,但在我的情况下,这是一个不使用任何可绘制对象的后台进程,因此对我不适用。 - headuck

0
如果您正在使用Android Studio,则在清单文件中添加“LargeHeap=true”。
像这样:
android:largeHeap="true"

谢谢,但问题不在于我的服务特别占用内存,所以这绝对是一种过度杀伤力的做法,并且也不是推荐的做法。https://dev59.com/DF4c5IYBdhLWcg3w6N07 - headuck
我认为将largeheap设置为true不是一个好主意。根据堆栈跟踪,没有位图操作导致OOM。https://dev59.com/DF4c5IYBdhLWcg3w6N07 - mcd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接