2010-10-22 53 views
5

这里的设置:Android:unarceling会导致内存不足异常。如何检查物体?

  • 我有一个活动与项目的列表(从服务器更新,由一个普通的Java类来表示)。项目通过自定义BaseAdapter和每行的自定义视图呈现。
  • 的项目实现Parcelable,所以当屏幕旋转时,物品保存在束作为ParcelableArrayList,则不必返回服务器中恢复。

到目前为止,这是一个相当简单的设置,但是我想将其中一个项目传递给另一个活动。捆绑有“pubExtra(字符串,Parcelable)”的方法,我想用把对象那里,然后通过意图通过。当我这样做时,由于OutOfMemoryException,设备开始强制关闭。看起来,当试图unarcel对象,它要求〜30mb(!)

似乎对象必须保持对其他东西的引用,因为对象本身只包含几个int/float/String字段和相关的方法。我一直无法通过查看代码或调试检查器来追踪这一点,并且我不知道如何有效地使用堆查看器。

有什么建议吗?

这里的堆栈跟踪

/dalvikvm-heap(5876): Out of memory on a 29098436-byte allocation. 
I/dalvikvm(5876): "main" prio=5 tid=1 RUNNABLE 
I/dalvikvm(5876): | group="main" sCount=0 dsCount=0 s=N obj=0x4001d8d0 self=0xccc8 
I/dalvikvm(5876): | sysTid=5876 nice=0 sched=0/0 cgrp=default handle=-1345017816 
I/dalvikvm(5876): | schedstat=(1107116708 1124999998 2626) 
I/dalvikvm(5876): at java.util.ArrayList.<init>(ArrayList.java:~84) 
I/dalvikvm(5876): at android.os.Parcel.readArrayList(Parcel.java:1460) 
I/dalvikvm(5876): at android.os.Parcel.readValue(Parcel.java:1792) 
I/dalvikvm(5876): at android.os.Parcel.readMapInternal(Parcel.java:2007) 
I/dalvikvm(5876): at android.os.Bundle.unparcel(Bundle.java:208) 
I/dalvikvm(5876): at android.os.Bundle.containsKey(Bundle.java:249) 
I/dalvikvm(5876): at <mypackage>.BaseDetailsActivity.isInModifyState(BaseDetailsActivity.java:184) 
I/dalvikvm(5876): at <mypackage>.DetailsActivity.onCreate(DetailsActivity.java:230) 
I/dalvikvm(5876): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
I/dalvikvm(5876): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
I/dalvikvm(5876): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
I/dalvikvm(5876): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
I/dalvikvm(5876): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
I/dalvikvm(5876): at android.os.Handler.dispatchMessage(Handler.java:99) 
I/dalvikvm(5876): at android.os.Looper.loop(Looper.java:123) 
I/dalvikvm(5876): at android.app.ActivityThread.main(ActivityThread.java:4627) 
I/dalvikvm(5876): at java.lang.reflect.Method.invokeNative(Native Method) 
I/dalvikvm(5876): at java.lang.reflect.Method.invoke(Method.java:521) 
I/dalvikvm(5876): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
I/dalvikvm(5876): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
I/dalvikvm(5876): at dalvik.system.NativeStart.main(Native Method) 

回答

13

我有这样归结为同一个问题:我滑倒了,我的变量WASN之一我认为Parcelable在很低的水平上工作

我的猜测是,在低级别,它试图读取错误的内存位置ArrayList,它从来没有得到“停止阅读!“si gnal。所以,它一直在疯狂阅读,直到堆空间达到应用程序限制。 *我也猜你可能有/正处于一个类似的问题

底线:仔细检查您的Parcelable读取和写入功能,并确保他们正在阅读/以相同的顺序写变量

  • 即使这是问了相当长的时间以前。我通过谷歌发现了这个页面,所以继续并发布这个以防其他人遇到同样的问题。

编辑:我会建议高度的建议,以及我鼓励投票。这实际上帮我缩小它的ArrayList在包裹对象

+1

我有同样的问题。我所做的是试图以相反的顺序读取值(堆栈)。但实际上,您需要按照您输入的顺序来阅读它们。 – 2012-08-13 13:32:51

+0

我认为它更像是一个二进制文件,所以它几乎是先进先出的 – 2012-08-30 20:52:12

+0

太棒了..帮助我..Thnaks! – 2016-12-18 17:23:40

5

你应该尝试使用Eclipse Memory Analyzer Tool。安装它作为一个插件到Eclipse,然后使用DDMS“转储HPROF文件”按钮(看起来像一个绿色的圆筒,设备选项卡“上的向下箭头)。在安装MAT时,Eclipse应该只是一些意见,启动它。检查你的记忆

如果您发布一些代码的,有人也许能找到问题太