2011-11-18 53 views
9

我有個奇怪的疑惑。我知道垃圾收集器有其自身的侷限性。如果分配是 不好,那麼它可能會導致應用程序以不尋常的方式響應的問題。Android中的垃圾回收(手動完成)

所以我的問題是,在每個活動結束時強制調用垃圾回收器(System.gc())是否是好的編程習慣?

更新

每一個是說,調用System.gc()在all.Then不利於我很奇怪,爲什麼目前的here.DVM將決定何時運行垃圾collector.Then什麼是必要的那種方法?

更新2

感謝社區幫助我。但老實說,我從這個鏈接瞭解垃圾收集真正的波伏娃Java Performance Optimization

+0

我不這麼認爲,如果你的應用程序缺乏性能,它應該是別的東西,除非你分配了大量的數據。是這樣嗎? – lc2817

+1

需要system.gc()方法http://stackoverflow.com/questions/3117429/garbage-collector-in-android –

+0

@ Ic2817仔細閱讀這個問題。我沒有說我的應用程序是以這種方式運行的。我正在討論system.gc() – Sameer

回答

9

不是良好的編程習慣在每次活動結束時強行調用垃圾收集函數(System.gc())

因爲它是無用的,所以只有DVM決定它應該在什麼時候打電話,但你稱它爲...

+0

謝謝大家快速回復。如果我在每個活動之後調用它,那麼它將如何工作。 – Sameer

+0

這將幫助你http://chaoticjava.com/posts/how-does-garbage-collection-work/ –

+0

是thanx ..但它會誰,誰想讀取垃圾收集java.But我想知道爲什麼system.gc()存在於這裏,如果一切都由DVM – Sameer

1

不;如果系統需要內存,它將自行調用GC。

當實例消失時,實例使用的任何其他地方未引用的內存將符合GC的條件。

實例自身使用的內存(如果不再引用)也符合GC的條件。你可以做一個代碼審查或分析,看看你是否堅持內存不必要,但這是一個不同的問題。

+0

的存在,那麼爲什麼要使用system.gc()? – Sameer

+0

@Sameer問原始的Java工程師。我假設你可以向系統提供提示 - 但它的行爲取決於實現。你知道你在一年前問過這個問題嗎? –

+0

是的,我在一年前問過這個問題。但是我仍然不確定使用System.gc()。所以我假設它提示JVM運行垃圾回收器(正如你剛纔所說),但不能強制JVM – Sameer

2

致電System.gc(),沒有任何傷害。但你不能確定它會有用處。因爲你要求該DVM做垃圾回收,但不能命令它......它完全依賴於DVM。當內存被耗盡或者可以在任何時候,它調用..

1

Patrick Dubroy在Google IO 2011上展示了一個關於內存管理的會話。自從他討論了堆分配和GC的工作以來,值得關注。你可以在這裏看它Memory Management

1

我試圖把System.gc()放在我在我的Android應用程序中創建位圖之前的行上。垃圾收集器在某些情況下釋放了幾兆字節,並放置並結束了我的OutOfMemoryError條件。它不會干擾正常的垃圾收集,但它確實使我的應用程序運行得更快。

+0

好吧..我有一些關於system.gc()的存在的想法,但讓它爲將來的最佳答案打開。然後我會接受其中的一個作爲答案,但爲你的努力付出高昂的代價 – Sameer

4

System.gc()的,其虛擬機有時會忽略瞎指揮,是在兩種情況下最有用:

  1. 你吞噬了記憶像沒有明天(通常與位圖)。
  2. 您懷疑存在內存泄漏(例如意外持有舊的Context),並且希望將虛擬機內存置於靜止狀態以查看內存使用量是否正在逐漸增加以進行調試。

在名義上的情況下,不應該使用它。

2

我真的認爲這取決於你的情況。

因爲堆是世代的,所以GC在其第一遍時可能不會擺脫某些大對象或位圖,並且其啓發式可能不會指示額外的垃圾回收是必要的,但確實存在啓發式可能的場景錯誤的,我們作爲開發人員瞭解模式,或者可以預測GC不能使用的用法,因此調用system.gc()會使我們受益。

我以前在特定場景中看到過這種情況,例如處理地圖平鋪或其他圖形密集行爲,其中Android中的本地GC(即使在3.0+設備上)沒有正確處理,導致內存不足錯誤。但是,通過添加一些GC調用,可以防止內存不足錯誤,並且系統繼續處理,儘管速度較慢(由於垃圾收集)。在圖形密集型操作中,這通常是應用程序崩潰所需的狀態(有點滯後),因爲它無法將額外資源加載到內存中。

我唯一的解釋,爲什麼在某些情況下發生這種情況似乎是時機。如果用戶操作速度很慢,那麼本機Android GC似乎很棒。但是,如果您的用戶快速滾動,或者快速縮放,這就是我看到Android GC滯後的原因,並且一些深思熟慮的System.gc()導致我的應用程序不會崩潰。

0

調用GC手動一個壞習慣編碼...

Developer docs on RAM usage狀態:

...
GC_EXPLICIT

一個明確的GC,這樣當你調用如gc()(其中您應該避免致電而是相信GC在需要時運行)。

...

我在這裏大膽強調了最重要,最相關的部分。