Android
gradle
ポエム

Android開発中にGC overhead limit exceededで逝く

More than 1 year has passed since last update.

兆候

今日はいつになくAndroid Studioの挙動が重かった。
前の仕事でもビルドが重いことがあった。
ビルドに3分4分かかることなんてザラで、ビルドするデーモンプロセスを常駐化させたりとチューニングしても効果が薄かった。

でも今日は違った。

大したコード量も書いてないし、確かにDataBinding使ったり、DIツール導入したりしたけど、そんなビルドで重くなるような要素にはならないなと。

それでも、ビルドするのに12分かかった。
どんどん重くなっていった。
そしてビルドエラーにたどり着いた。

GC overhead limit exceeded

またポエム書いちゃった。

単刀直入に言えば、
transformJackWithjackfordebug というタスクでビルドエラー吐く。
そのあとに続くメッセージが
GC overhead limit exceeded だった。

詳しく分析してないけど、gradleのスクリプト走らせる時のJVMのヒープサイズが小さいとよく起こる問題らしい。
jackコンパイラがヒープめっちゃ使うのかも。

なお

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8 
    }
}

を指定している前提でした。

解決方法

android {
    dexOptions {
         javaMaxHeapSize "2g"
    }
}

これ指定するだけで、ビルドからエミュレータまでの転送時間が2、3秒になった。
うそでしょ

追記

Androidアプリのビルドを高速化するDex In Processが有効になる条件
この記事によると、 gradle.properties
org.gradle.jvmargs の値を javaMaxHeapSize を超えてないとダメみたい。

こういう関係性
javaMaxHeapSize < org.gradle.jvmargs

追伸

同じエラーで、これで解決しなかったらごめんなさいm(_ _)m