BitmapFactory.nativeDecodeStream()内存不足的android应用程序

时间:2014-12-18 03:22:13

标签: android memory

所有,我在手机上遇到了内存不足异常(4.4.4 MotoX)。拍照后,我从sdcard-path读取它,然后发生异常。

12-18 11:12:47.294  11966-11966/com.geexfinance.geexfinance E/dalvikvm-heap﹕ Out of memory on a 42024976-byte allocation.
12-18 10:15:42.099  12905-12905/com.geexfinance.geexfinance E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.geexfinance.geexfinance, PID: 12905
    java.lang.OutOfMemoryError
            at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
            at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:620)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:634)
            at com.geexfinance.geexfinance.model.GeexCache.getBitmap(GeexCache.java:1825)
            at com.geexfinance.geexfinance.model.GeexCache.getBitmap(GeexCache.java:1940)
            at com.geexfinance.geexfinance.ui.GeexApplyInstallmentFragment.onActivityResult(GeexApplyInstallmentFragment.java:532)
            at android.app.Activity.dispatchActivityResult(Activity.java:5450)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3428)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3475)
            at android.app.ActivityThread.access$1300(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

看起来很奇怪,我在华为垫上运行相同的应用程序(4.4.3),OOM永远不会发生。

我看了ANDROID_STUDIO的内存监视器。在我的手机上,内存分配从32MB到90MB,OOM异常总是发生在大约48MB.on我的垫,内存分配从32MB到40MB,从未遇到OOM。

我有一些问题:

  • 我的手机有2048MB的内存,为什么只有42MB的分配会导致OOM?
  • 为什么当内存为48MB时发生OOM,它不是内存峰值。
  • 相同的应用程序,相同的用户行为(拍3张照片),为什么手机有异常并且没有填充?

2 个答案:

答案 0 :(得分:1)

my phone have 2048MB memory ,why only a 42MB allocation leads a OOM?

设备的总RAM内存与每个应用程序实例分配的堆大小无关。

why OOM occurs when memory is 48MB,it's not a the memory peak.

当请求的内存超过堆大小时,会发生OOM,如上所述。

same application, same user behavior(take 3 photos), why phone have a exception and pad not?

有许多与无法重现OOM相关的因素,可能是照片细节和大小,可能是该时间点应用程序的当前内存消耗。阅读有关如何有效处理大Bitmap的内容,我确定问题会消失。

答案 1 :(得分:0)

可能需要大堆,尝试写入AndroidManifest.xml

android:largeHeap="true"