close

今天在開發專案發生了件可怕的案件

 

是情是這樣的
一直以來都用Genymotion 開發的我
今天想到用舊一點的HTC手機跑跑看
結果就發生了下面的錯誤:

 

Error:Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
Error:Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded



(約30個之後結尾是下面這段)



Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Error while executing java process with main class com.android.dx.command.Main with arguments {--dex --num-threads=4 --multi-dex --main-dex-list /Users/xxx/Documents/Source/StudioProject/xxx/app/build/intermediates/multi-dex/debug/maindexlist.txt --output /Users/xxx/Documents/Source/StudioProject/xxx/app/build/intermediates/transforms/dex/debug/folders/1000/1f/main /Users/xxx/Documents/Source/StudioProject/xxx/app/build/intermediates/transforms/jarMerging/debug/jars/1/1f/combined.jar}

 

OutOfMemoryError 相信大家都很熟悉
那什麼是GC overhead limit exceeded呢?
這其實有兩個回答
1、花太多時間在 garbage collect (預設是 98%), 太少時間在做你程式原本要做的事
2、建立太多物件, 導致 GC 需要花很多力氣與時間去 garbage collect
知道了這件事情之後
我就開始檢查code有沒有哪裡是不斷new Object 的
但其實並沒有這種情況發生

 

後來經過冷靜下來分析
我發現了一點蛛絲馬跡
原來這個錯誤是 HeapSize 不足所造成的
也就是說,因為 HeapSize 空間小
所以使得系統一直不斷的做 GC 的動作
而造成APP shutdown
只要在 build.gradle 裡加上這段,就可以解決問題了

dexOptions {
    javaMaxHeapSize "4g"
}






資料來源:
http://stackoverflow.com/questions/25013638/android-studio-google-jar-file-causing-gc-overhead-limit-exceeded-error
https://puremonkey2010.blogspot.tw/2011/11/java-javalangoutofmemoryerror-gc.html


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 顏澤偉 的頭像
    顏澤偉

    Willy's Fish教學筆記』

    顏澤偉 發表在 痞客邦 留言(0) 人氣()