2010-10-22 71 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應該只是一些意見,啓動它。檢查你的記憶

如果您發佈一些代碼的,有人也許能找到問題太