2011-05-19 56 views
0

我遇到了Android垃圾收集器的問題,並希望有人能指出我在這裏可能做錯了什麼。在我的程序開始時,我有很多數據被生成並拋入ArrayList。我在下面做的例子...Android垃圾收集器和ArrayLists

m_aUnitsPhysical.add(new UnitData("P01", 1, 0, 0, false, false, 300, UnitType.PHYSICAL, 1, "Unit Name")); 

在我的類的構造函數中有大約236個這樣的語句。數組定義爲:

private ArrayList<UnitData> m_aUnitsPhysical; // Physical array listing 

而且萬一有幫助,在類的構造函數是...

public UnitData(String p_szID, int p_iAtk, int p_iDef, int p_iUp, boolean p_bLoot, boolean p_bHonor, int p_iCost, UnitType p_Type, int p_iLevel, String p_szName) 

UNITDATA是一類礦井,簡單地存儲數據,有點像舊的C結構。我知道在這個操作過程中我正在咀嚼大量的記憶。然而,當它完成時,垃圾收集器(如logCat所示)啓動並釋放大量的數據。

那麼,這是怎麼回事?垃圾收集器是否因爲我正在做上述說明而感到憤怒?還是它告訴我它正在從其他應用程序中消除內存?有什麼辦法可以告訴?有沒有更好的方式做我以上做的事情,不會佔用太多的內存?我應該嘗試使用SqlLite數據庫而不是這樣做嗎?

我很少從我的用戶那裏得到他們已經遇到內存問題的報告,但他們正在發生。主要是當他們由於某種原因離開應用程序後回到它;數組中的數據消失。我只是想弄清楚我應該怎麼做這樣做是爲了防止我做錯了。任何有識之士將不勝感激!

+0

我沒有看到這個問題...你有沒有例外?您的陣列意外清除了嗎? – 2011-05-19 11:45:29

+0

我在我身邊很少遇到異常情況,但對於最終用戶我不能這麼說。最主要的問題似乎是數組被填充,用戶徘徊在我的應用程序之外做其他事情,然後回到它並且數組中的一些數據不再存在。我剛剛設置的值可能會在5-10秒後消失在一些非常奇怪的情況下。 GC是我能看到的唯一可以做到的事情,並且試圖圍繞它來減少內存開銷並阻止它發生(希望是......)。 – AzHole 2011-05-19 20:50:44

+0

數組本身存儲在哪裏?也許在某種對內存敏感的緩存中? – 2011-05-19 21:11:13

回答

1

如果您使用一組靜態數據傳送應用程序(因爲它聽起來像是),那麼您可能希望將數據集包含在預製數據庫中。以下是關於如何做到這一點的great tutorial

也就是說,200條記錄不應該導致任何內存問題。如果問題發生在用戶重新打開您的應用程序幾次之後,請確保您沒有不必要地重新加載任何數據;在再次加載之前檢查您的陣列是否已經被填充。

+0

該數組只在mainapp構造函數中填充一次。但我想我明白你要去哪裏了,所以我會看看。感謝您的鏈接!我可能會轉到sqlLite,以使內存方面的生活更輕鬆,但我必須重寫一個主要部分來完成它。哦,那最終可能會值得! – AzHole 2011-05-19 13:56:27

+0

不只是從資產中複製數據庫。創建一個新的,只是添加查詢來填充。我有一些令人討厭的碎片體驗,從數據庫複製資產+你有兩倍的空間(就像它有兩個相同的文件在文件系統中的不同位置)。所以我不得不不同意這個問題。但正如他還表示,200個對象並沒有太大的吸引力,垃圾收集也不是問題。 – DArkO 2011-05-19 14:06:27

0

對大量數據使用數據庫。這是最好的和推薦的方式。

當前設置嘗試創建較少的對象。試試這與一個單一的對象,只是取代它的數據,並將其添加到列表中。不知道這是否會提高性能,但我相信它應該。建設者是昂貴的。

+0

這不會破壞所有的條目嗎?如果我創建UnitData對象,將它添加到列表(它是一個指向對象的指針),然後更改對象中的數據並再次添加(再次指向),現在兩個對象都不會包含相同的數據嗎?或者,在將系統添加到數組時,系統是否使用了複製構造函數? – AzHole 2011-05-19 13:54:58

+0

不,它不會。該對象被添加到列表中,以便您創建的上一個對象由垃圾回收器收集,因爲它們沒有任何對它的引用。這就是爲什麼你看到一個大型的垃圾收集活動。 – DArkO 2011-05-19 14:04:30

0

GC將永遠刪除強烈引用的對象(即通過WeakReference或類似的未引用),即使它運行的內存(在這種情況下,它會拋出一個OutOfMemoryError)。

您的問題必須在其他地方。

(其他海報使用數據庫來存儲你的價值觀建議,但對於僅有200項,我看到你們的做法沒有問題 - 除非這些對象是極其複雜的/巨大)

+0

該構造函數中顯示的所有數據都是其中的所有數據。有幾個例程來獲取數據並將數據存回,但就是這樣。不以任何形式複雜。 = /這個數組是在一個類的對象內創建的,它在根/主類的android java類中創建,所以它的使用壽命應該是整個應用程序的壽命。 – AzHole 2011-05-19 21:31:57