Android 5.0上的java.lang.OutOfMemoryError,在5M可用时由16k分配引起

Android 5.0上的java.lang.OutOfMemoryError,在5M可用时由16k分配引起,java,android,out-of-memory,android-5.0-lollipop,galaxy,Java,Android,Out Of Memory,Android 5.0 Lollipop,Galaxy,我从Google Play收到了以下关于我的Android应用程序的奇怪崩溃报告(注意分配的数量与可用的可用空间)- java.lang.OutOfMemoryError:无法分配16396字节的分配,其中包含5746272个可用字节和111MB,直到OOM 位于com.android.internal.util.FastXmlSerializer.(FastXmlSerializer.java:55) 位于com.android.internal.util.XmlUtils.writeMapX

我从Google Play收到了以下关于我的Android应用程序的奇怪崩溃报告(注意分配的数量与可用的可用空间)-

java.lang.OutOfMemoryError:无法分配16396字节的分配,其中包含5746272个可用字节和111MB,直到OOM
位于com.android.internal.util.FastXmlSerializer.(FastXmlSerializer.java:55)
位于com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:183)
在android.app.SharedReferencesImpl.WriteFile(SharedReferencesImpl.java:597)上
在android.app.sharedpreferencesiml.access$800(sharedpreferencesiml.java:51)
在android.app.SharedReferencesImpl$2.run(SharedReferencesImpl.java:512)
在android.app.SharedReferencesImpl.enqueueDiskWrite上(SharedReferencesImpl.java:533)
在android.app.SharedReferencesImpl.access$100(SharedReferencesImpl.java:51)
在android.app.SharedReferencesImpl$EditorImpl.commit(SharedReferencesImpl.java:455)上
在com.headuck.headuckblocker.bj.a(未知来源)
位于com.headuck.headuckblocker.UpdateService.e(未知源)
位于com.headuck.headuckblocker.UpdateService.a(未知源)
位于x.a.onHandleIntent(未知来源)
位于android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:145)
运行(HandlerThread.java:61)
我知道有很多关于OutOfMemoryError的问题,但似乎没有一个是由于字节分配比可用空间小得多造成的

该用户使用的是Android 5.0上的Galaxy S5,并报告说,此类崩溃发生在玩游戏时(哪些游戏不重要)-我认为,每当他/她在前台使用另一个内存密集型应用程序,并且我的应用程序的后台服务计划运行时,这种情况就会再次发生。作为一个谷歌播放报告,我没有其他方法获得更多的细节

我的问题是,什么可能导致这种情况发生,应用程序可以采取什么措施来避免这种情况

一些后台(如果这是相关的):上述崩溃来自我的应用程序定期安排的后台服务,它不涉及任何UI/位图。它所做的只是从服务器下载数据和更新数据库/状态。它在内存少得多的5年机器上运行时没有任何问题,按照现代安卓手机的标准,内存应该非常少。上面的错误实例发生在数据库更新之后的某个点,并且服务正在将更新状态写入共享首选项


编辑:在发帖后阅读与此问题相关的内容,但在这种情况下,可用的可用空间不太可能如此分散?还有其他可能的原因吗?

如果您使用的是Android Studio,请在清单文件中添加“LargeHeap=true”

像这样,

android:largeHeap=“true”

我也遇到过类似的问题。 这就是我为解决这个问题所做的

  • 在res/文件夹中创建一个新文件夹drawable nodpi
  • 将/drawable文件夹中的所有“图像”移动到/drawable nodpi文件夹

  • 希望这对某人有所帮助:)

    谢谢,但问题不是我的服务特别需要内存,所以这肯定是一种过度消耗,也不是一种推荐的做法,我不这样认为,在true中添加largeheap是一个好主意。根据stacktrace,没有位图操作导致oom。谢谢,可能对其他人有用,但在我的特殊情况下,这是一个后台过程,没有使用任何可绘制的,所以这不适用于我。
    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)