2016-05-19 79 views
1

Error:Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded api 19OutOfMemoryError:超出api的GC開銷限制19

現在是什麼?

僅當我嘗試在API 19仿真器上運行它時(如錯誤文本所述),此錯誤纔會發生。所以好吧,我明顯得到了我的應用程序剛剛成爲大...或做到了?

我想我實際上並沒有完全理解那個錯誤。 這是什麼意思其他然後我需要增加我的堆大小?

接下來的問題是:增加它不好嗎?我可以只增加它的API 19,並將它留在其他地方,因爲它完美地工作於例如API 23?

如果我不想增加它,該怎麼辦?我如何知道什麼是非常重要的?一般我可以做些什麼來保持它小?

所以這是一個很大的問題,以防止他們告訴我後只有一個問題好版主,在這兒,最終和所有包括的問題: 如果它是壞的增加堆大小,我需要做什麼以避免出現此錯誤?

回答

0

你從哪裏得到這個問題?

在編譯期間或運行應用程序期間?

如果是第一個,在編譯階段需要確保你的堆很大。如果您使用的搖籃,你會增加這樣的事情你的腳本:

dexOptions { 
    javaMaxHeapSize "2g" 
} 

在第二種情況下 - 發生故障運行你的應用程序時,你可能需要重新設計你的應用程序,所以它消耗更少的內存。您無法控制用戶設備的JVM參數。

編輯:我不知道爲什麼兩個API級別之間存在差異,但我認爲它與從API級別21使用另一個運行時(ART)的事實有關。在這裏閱讀更多關於此:https://developer.android.com/studio/build/multidex.html 編譯階段可能會有點不同,因此導致API級別之間不同的內存要求。

+0

我在編譯期間通過gradle得到它...... javaMaxHeapSize「2g」只會影響編譯階段嗎?或者這是否也會影響輸出? – Maverick283

+0

看,這是我埋葬的地方:我不明白爲什麼在api 23設備上執行編譯沒有給出相同的錯誤。據我瞭解,無論我使用什麼設備,我編譯的輸出結果都是一樣的。 – Maverick283

+0

它僅在編譯階段產生影響,它在運行時不會對應用程序的堆大小產生任何影響。 –

0

據我所知,沒有辦法增加真實手機上的堆積,只能增加模擬器中的堆積。我所做的經驗是,每臺設備都有自己的固定大小的堆,由VM使用。我的一些應用程序沒有運行在「舊」的Android-/API-版本上,我遇到了同樣的問題。我用我的舊三星Galaxy S2只有64MB的堆,這是不能改變的。

對我來說,最終的解決方案是配置我的應用程序,並做大量的重新設計,以減少我的應用程序的內存消耗。幸運的是,Google已經寫了一些關於這個主題的東西以及如何處理它。我建議你開始閱讀Managing Your App's MemoryInvestigating Your RAM Usage。在那裏你會發現一切,開始分析你的應用程序的內存消耗。

相關問題