2011-11-28 64 views
1

我試圖打擊內存泄漏導致堆用盡內存和GC來調用。很多。DDMS分配跟蹤器填充「SimpleListIterator」

logcat的填充有消息是這樣的:

11-27 20:54:39.052:DEBUG/dalvikvm(32167):GC_CONCURRENT釋放405K, 5%的遊離11046K/11591K,暫停2MS + 3ms的

我用DDMS分配跟蹤,看看是否有什麼特別得到分配比平時多,那我點擊「獲取分配」在Eclipse中按鈕的瞬間,該列表中瀰漫着的java.util .AbstractList $ SimpleListIterator 他們在主循環期間得到分配,所以有很多,我相信這是吃堆內存的東西。 509分配的SimpleListIterator)

然而, DDMS告訴我,他們正在分配任何有for-each循環,我認爲這是奇怪的。 O_O

通常我會用循環的常客,但this article建議使用for-each循環,而不是因爲它的速度更快,但它提到關於其內存使用量沒有

難道所有這些分配是使用的結果爲每個循環,而不是常規的循環? (需要一段時間才能進入並更改每個應用的每個循環,因此我寧願先問) 如果是,那麼這是正常的嗎?這是我的編程錯誤?

UPDATE 我將for-each循環更改爲regular循環,並徹底解決了這個問題。我仍然認爲它的愚蠢,雖然我不得不這樣做

+0

您是否在此閱讀過有關此問題的相關主題? – davidcesarino

+0

哪些「相關主題」? – AlexRamallo

+0

請參閱下面的「回答」(引號)... – davidcesarino

回答

0

大發免責聲明:這不是一個真正的答案(也許)。除了我讀過的東西之外,我不知道這個話題。我寧願將此作爲評論發佈,但大小限制和格式化功能使答案成爲更好,建設性的替代方案。我不明白這個問題足以回答,我只是在幫助研究。

Android dev guide

隨着一個ArrayList,手寫計數循環爲約3倍更快(具有或不具有JIT),但對於其他集合增強循環句法將是完全等同到顯式迭代器的使用。

Here,用戶一基準for-each循環:

N.B.我注意到使用String s:stringsList比使用舊式for循環訪問列表要慢50%左右。去圖...這是我計時的兩個功能;數組和列表中填充了5000個隨機(不同)字符串。

下面,另一個用戶警告基準。就我個人而言,我懷疑使用for循環會在代碼中產生這樣的問題,因爲我一直對Java中的微基準測試持謹慎態度。對於我所看到的,這一切都歸結爲運行Iterator對象的微秒。我相信你做錯了什麼,只是因爲你刪除了增強功能,並且它的執行效果更好,並不意味着增強功能本身就很慢或很差。

On another topic

TL; DR:增強的循環的確比超過一個ArrayList傳統基於索引的循環速度較慢;但對於大多數應用來說,差異應該可以忽略不計。

See a doc關於增強for循環。在循環中,您不應該隨意更改列表。如果這涉及到你的問題,我不知道。也許,如果我看到代碼和日誌行。

所以,我想你的代碼做錯了。 :-)但最好等到有經驗的人來到這裏。