Android Stduio でアプリの改修作業を行っていたら、ある時突然 CPU 使用率が80%~90%超で推移して、フリーズするようになってしまいました。
結論としては・・・修正したコードに無限ループが含まれていたことが原因だったようです(トホホです)。
まあ、それがわかるまでに結構時間を使ってしまったので、一応やったことメモに残しておきます。
- OS: WIndows 11 22H2
- Android Studio : 2021.3.1 Dolphin Patch 1
異常発生
何も意識せずに、とあるプロジェクトの修正作業を行っていたところ、急に Android Studio が重くなり、フリーズしてしまいました。当然、何の操作もできなくなりました。
仕方ないので、何が起きたんだ?と思いつつ、タスクマネージャで落としてから、もう一度立ち上げても、しばらくすると同じ現象になります。
今度は、タスクマネージャをよく見ると、 CPU 使用率が非常に高いままになって、一向に下がりません。
どうも、何かトラブったようです。
やったこと
手始めにこんなことをやりました。
- Android Studio の再起動
- PC の再起動
これでも改善しません。プロジェクトを壊してしまったかな?と思ったので、一度、別のプロジェクトを開いてみます。なんと、問題なく開けますね。どうも、プロジェクト依存の問題のようです。
ということで、
- プロジェクトのバックアップコピーをとっておき、 build, .idea, .gradle あたりをディレクトリごと削除して、Android Studio でオープン
としてみました。これやったとき、一時的に治ったかに見えたのですが、結局作業を始めると同じ現象になってしまいました。
そうこうするうちに、画面上に Analyzing... とでて止まっているのに気が付いたので、それでググると、似たような現象の記事がありました。
kotlin - Android Studio stuck at "Analyzing..." - Stack Overflow
それによると、Android Studio のキャッシュを消せ、とのこと。なので、
- C:\Users\ユーザー名\AppData\Local\Google\AndroidStudio2021.3\cache を削除
とやってみましたが、再度試してもだめ。
困ったなーと思って、上記のディレクトリを眺めていると、 log というフォルダがあります。ここを見ると、いろいろとあるんですが、 idea.log というファイルが今試している更新日時になっています。これが、 Android Studio のログファイルっぽいぞ、とおもったので、エディタで開いてみると、今回のエラーが起きてる日時について、 OutOfMemory だの Low Memory だのというメッセージがたくさん見えます。
あ、これが原因だったのね。(最終的に、これは原因ではありませんでした。あとで、間違いに気づきます。)
対応策?
原因がわかれば、対応できます。
ヒープサイズエラーが出た時の対処方法 - Android アプリ開発「MATRIX」
Android Studio のメモリ不足(ヒープサイズエラー)は昔も対応やったな、と思いつつ、改めてググってみると、上記のような記事が出てきました。
早速、いったん、 Android Studio を閉じて、テキストエディタを開き、このプロジェクトの gradle.properties ファイルを開いて、 -Xmx2048m となっているこころを -Xmx4096m にしてみます。
その後、 Android Studio を起動します。これで、解決!
とおもいきや、状況が変わりません。あれれ?とおもって、さらに調べてみると、どうもこの設定は、一度プロジェクトをリビルドしないと有効にならないとのことです。
Configure Android Studio | Android Developers
まじか。。。
ということで、仕方ないので、編集中のファイルを一旦、スタッシュに退避させて、リポジトリを間違いなく動いていたところまで戻して、この状態で Android Studio を立ち上げます。
で、さきほどの gradle.properties を編集後、 rebuild をかけます。問題ないですね。
ここまで出来たら、リポジトリを元に戻して、さらにスタッシュに退避させていたものを反映させます。この状態で Android Studio を操作すると、おぉ、無事に動きます。
ついでに、上記の記事を元に、 IDE のメモリの上限も増やしておきました。
これで解決、と思ったのですが、しばらくすると、やっぱりフリーズします。新たに割り当てたメモリが足りないのかな?とおもいつつ、 2G -> 4G -> 8G -> 16G -> 32G あたりまで試しましたが、やっぱり落ちます。
これは妙だな。なんか違うぞ。
Android Studio の再インストール
やる手がなくなってきたので、 Android Studio も再インストールしてみます。
2021.3.1 Dolphin Patch 1
を 2023.1.1 Patch 2
にしました。
で、結論は・・・やっぱり状況変わらずです。
原因発見!
何が原因だろうか?と思っていろいろと調べてみるけど、なかなか理由がわかりません。何かの際に、先ほどの AndroidStudio のログファイルを見直していたら、 OutOfMemory のところにスタックトレースが出ており、自分が修正したクラス名が出ているのがわかります。しかも、その後 HashMap でエラーが起きて止まってます。
ん? HashMap でエラー?なんか怪しいぞ。
と思ってコードをよく見ると、なんと、 HashMap に要素を追加する処理が無限ループになっています!
やっと見つけました。
単に処理中に無限ループがあるのではなく、運悪く既存の Layout クラスを extends して、独自のクラスを定義している時に、一部の初期化処理を static イニシャライザ( static の初期化ブロック)で行っており、その中に無限ループを入れ込んでいました。
static のため、プロジェクトを実行しなくても、このクラスを用いたレイアウトファイル(xml ファイル)を表示するだけで、初期化処理が動いて無限ループが呼ばれたようで、当然メモリが足りなくなり、落ちていたということのようです。
あー、こんなことが原因になるなんてな・・・
まとめ
結局、ヒープメモリ設定は悪くなく、上記のバグ修正後は元に戻しても快適に動いていました。思わぬところで OutOfMemory を引き起こしていましたね。こんなミスもあるよ、ということで、晒しておきます。何かの参考になれば幸いです。
にしても、最初に Android Studio のログ見たときに、もうちょっと注意していれば、解決が早かったように思えて、悔やまれます。ログの確認は大事ですね。