所有,我在手机上遇到了内存不足异常(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。
我有一些问题:
答案 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"