Android:字节分配(android.graphics.Bitmap)的内存不足

3

我一段时间没有使用我的应用程序,让它在后台空闲了一段时间,当我再次打开它时,我注意到它变得非常缓慢,然后就无法响应了。于是我检查了logcat,看到了"Out of memory on a 557296-byte allocation"的错误。在我的应用进入空闲状态之前,我最后做的事情是向数据库中的几个表添加了多条记录。然而,在内存错误出现之前,logcat中的最后一行与位图有关?..."android.graphics.Bitmap.createBitmap"。我不确定如何开始追踪这个问题。

11-07 20:32:22.940: D/PMS(599): acquireWL(42e31570): PARTIAL_WAKE_LOCK  CM_static 0x1 13857 10166
    11-07 20:32:22.950: D/PMS(599): releaseWL(42e31570): PARTIAL_WAKE_LOCK  CM_static 0x1
    11-07 20:32:23.060: E/dalvikvm(16038): can't open /data/misc/app_oom.hprof: Permission denied
    11-07 20:32:23.100: E/dalvikvm-heap(16038):  hprofDumpHeap failed with result: -1 
    11-07 20:32:23.100: E/dalvikvm-heap(16038): After hprofDumpHeap for process
    11-07 20:32:23.100: E/dalvikvm(16038): Out of memory: Heap Size=196608KB, Allocated=188196KB, Limit=196608KB, Proc Limit=196608KB
    11-07 20:32:23.100: E/dalvikvm(16038): Extra info: Footprint=196512KB, Allowed Footprint=196608KB, Trimmed=2828KB
    11-07 20:32:23.200: I/dalvikvm-heap(16038): Clamp target GC heap from 193.013MB to 192.000MB
    11-07 20:32:23.200: I/dalvikvm-heap(16038): Forcing collection of SoftReferences for 557296-byte allocation
    11-07 20:32:23.240: D/MtpDatabase(25526): sessionStarted
    11-07 20:32:23.310: I/dalvikvm-heap(16038): Clamp target GC heap from 193.013MB to 192.000MB
    11-07 20:32:23.310: E/dalvikvm-heap(16038): Out of memory on a 557296-byte allocation.
    11-07 20:32:23.310: I/dalvikvm(16038): "main" prio=5 tid=1 RUNNABLE
    11-07 20:32:23.310: I/dalvikvm(16038):   | group="main" sCount=0 dsCount=0 obj=0x41f267e8 self=0x41f113b8
    11-07 20:32:23.310: I/dalvikvm(16038):   | sysTid=16038 nice=0 sched=0/0 cgrp=apps handle=1074839548
    11-07 20:32:23.310: I/dalvikvm(16038):   | state=R schedstat=( 0 0 0 ) utm=61459 stm=7538 core=3
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.graphics.Bitmap.nativeCreate(Native Method)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.graphics.Bitmap.createBitmap(Bitmap.java:1041)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.graphics.Bitmap.createBitmap(Bitmap.java:983)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.buildDrawingCache(View.java:13312)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.getDrawingCache(View.java:13161)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:13859)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.drawChild(ViewGroup.java:3105)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.widget.ListView.drawChild(ListView.java:3590)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2934)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.widget.AbsListView.dispatchDraw(AbsListView.java:2520)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.widget.ListView.dispatchDraw(ListView.java:3560)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:14175)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.widget.AbsListView.draw(AbsListView.java:3993)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:14053)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.drawChild(ViewGroup.java:3105)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2934)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:14175)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:14053)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.drawChild(ViewGroup.java:3105)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2934)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:14051)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.drawChild(ViewGroup.java:3105)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2934)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:14051)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.drawChild(ViewGroup.java:3105)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2934)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.View.draw(View.java:14175)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.widget.FrameLayout.draw(FrameLayout.java:467)
    11-07 20:32:23.310: I/dalvikvm(16038):   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2312)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2761)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewRootImpl.draw(ViewRootImpl.java:2674)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2491)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2048)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5849)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:786)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.Choreographer.doCallbacks(Choreographer.java:586)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.Choreographer.doFrame(Choreographer.java:546)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:771)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.os.Handler.handleCallback(Handler.java:730)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.os.Handler.dispatchMessage(Handler.java:92)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.os.Looper.loop(Looper.java:158)
    11-07 20:32:23.310: I/dalvikvm(16038):   at android.app.ActivityThread.main(ActivityThread.java:5789)
    11-07 20:32:23.310: I/dalvikvm(16038):   at java.lang.reflect.Method.invokeNative(Native Method)
    11-07 20:32:23.310: I/dalvikvm(16038):   at java.lang.reflect.Method.invoke(Method.java:525)
    11-07 20:32:23.310: I/dalvikvm(16038):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
    11-07 20:32:23.310: I/dalvikvm(16038):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843)
    11-07 20:32:23.310: I/dalvikvm(16038):   at dalvik.system.NativeStart.main(Native Method)
    11-07 20:32:23.310: E/dalvikvm-heap(16038): Generating hprof for process: com.test.myApp PID: 16038

这个链接中的答案帮助我找到了我的内存泄漏问题:[https://dev59.com/OXM_5IYBdhLWcg3w9oaG][1] - Mike6679
1个回答

7

您的应用程序中是否使用了位图?您必须使用bitmap.recycle()回收位图。如果不回收位图,则会出现内存不足异常。

如果您确实有位图,请在使用后执行以下操作:

bitmap.recycle();
bitmap = null;

这将确保位图被垃圾回收。
如果您没有位图,建议使用DDMS提供的工具来监视堆大小。让您的设备休眠并记录应用程序的更改。我已经使用这些工具解决了几个内存不足异常问题,希望您也能够成功。

谢谢,你指引了我正确的方向,我找到了这个链接:https://dev59.com/OXM_5IYBdhLWcg3w9oaG 。请看答案:“在开发Android应用时,我发现最常见的错误之一是“java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget”错误。” 我有一种感觉,这可能是我的问题所在。 - Mike6679
经过进一步的研究,我认为我上一个评论是不正确的。我不想仅仅处理我的问题症状,而是要找到问题的根源,即一个或多个内存泄漏。这里的链接:https://dev59.com/DmfWa4cB1Zd3GeqPhXut 实际上涉及到如何在Android中跟踪内存泄漏以及如何避免它们。 - Mike6679

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