Androidアプリを作っていてOutOfMemoryErrorが結構起こる。スマホの能力がまだまだ低いということなのかもしれない。
OutOfMemoryError(メモリリーク)対策
- Memory Analyzerのインストール
- メモリリークしていそうなところの分析
- 対策
Memory Analyzerのインストール(JUNOの場合)
Eclipseの「ヘルプ」→「新規ソフトウエアのインストール」で、作業対象に「Juno – http://download.eclipse.org/releases/juno」を選び、
1.BIRT Engin OSGi Runtime SDK Featureのインストール
eclipseRTターゲットプラットフォームコンポーネントから「BIRT Engin OSGi Runtime SDK Feature」インストール。
2.MemoryAnalyzerのインストール
一般ツールから「MemoryAnalyzer」をインストール
メモリリークしていそうなところの分析
- 対象のアプリをデバック実行する。DDMSを開き、deviseパースペクティブで対象アプリに「update heap」。そして、CauseGCでガッベージコレクションを実行する。
- ある程度時間が経ったら、deviseパースペクティブで「dump HPROF file」を実行する。
- MemoryAnalyzerが起動して、メモリリークの分析に入る。
- 最初の画面で「Leak Suspects」へのリンクをクリック。
- Leak Suspects画面で、いくつかある「Problem Suspect」をチェックする。
- 「instances of “java.lang.Class”, 」という感じでインスタンスの種類などを知ることができる。
- dominater treeタブをクリックして開き、一番上の「regex」にプロジェクトのパッケージ名を入れ、必要なデバック中のプロジェクトの情報だけに限定する。
- ツリーをだどって行くと、どういう値が残っているか知ることができる。
- プログラム上であやしい部分をコメントアウトしてどこに問題があるのかを切り分ける。
- 問題を発見する。
OutOfMemoryError(メモリリーク)の実際の対策
- しっかりインスタンスへの参照を破棄する。
- 画像の使い方など効率よく、少ない量でできないか。
- インスタンスを使いまわさない。
- linerlayoutなどadd()するとスタックに溜まっていくので、書きかえるなら消してから。