How to Fix Memory Leaks in Your Android App

If your app is slow on some devices or Android Studio’ Instant Run features stopped working randomly, then you might be experiencing memory leaks.

When Does A Memory Leak Happen?

The one of great things about Java is garbage collector (GC). ガベージコレクタは定期的に実行され、使用されていないオブジェクトをチェックし、それらを削除します。 メモリリークは、アプリケーションで使用されていないオブジェクトがあるにもかかわらず、ガベージコレクタがそれを認識できない場合に発生します。 したがって、それらは未使用のままメモリに残り、アプリで使用可能なメモリ量が減少し、予期しない結果を引き起こします。

How To Detect Memory Leaks?

これを行うには、いくつかの方法があります。 この記事では、そのうちのいくつかを取り上げます。

その前に、メモリ リークを発生させる可能性のあるコードをいくつか書いてみましょう。 ここでは、2 つのアクティビティを持つアプリを作成します。 アクティビティ A には、アクティビティ B を開くボタンがあります。 これと並行して、Context の静的参照を保持するシングルトン クラスも作成します。

class Manager {
private static Manager ourInstance;

private Context context;

static Manager getInstance(Context context) {
if (ourInstance == null) {
ourInstance = new Manager(context);
}
return ourInstance;

private Manager(Context context) {
this.GetInstance {

getContext {
if (ourInstance == null) {

ourInstance {

etc.context = context;
}
}

アクティビティ A からこのシングルトンを呼び出します

Manager.getInstance(this);

Detecting Memory Leaks Using Android Studio’s Monitors

android memory leaks

Android Studio にはアプリケーションのパフォーマンスをプロファイルするのに役立つツール、その 1つがメモリ モニタです。 Memory Monitor を使用して、次の手順でメモリ リークを検出することができます。 モバイルデバイスまたはエミュレーターでアプリを実行します。

2. Android Monitorを開きます(MacではCmd + 6、WindowsではAlt + 6を押します)。 Memory Monitorの上部にある「Start Allocation Tracking」をクリックします。

3.メモリリークが発生していると思われる部分の周囲でアプリを使用します。 この例では、別のアクティビティに移動します。

4. [Initiate GC]をクリックして、ガベージコレクタが現在使用されていないオブジェクトの収集を開始し、それらを削除するように強制します。 メモリグラフが少し減少するのがわかるはずです。

5. Dump Java Heapをクリックして、Android Studioにヒープスナップショットを含む.hprofファイルを生成させます。 メモリリークを確認する最も簡単な方法は、Analyzer Tasks

6を使用することです。 Analyzer Tasksタブを開き、このタブの上部にあるRunをクリックします。 Analyzer Tasks タブの下の Analysis Results タブにリークしたアクティビティが表示されるはずです。

memory leaks android

Detecting Memory Leaks Using Leak Canary

Leak Canary は Square が作ったライブラリで、メモリリークの検出には非常に高速な方法です。 Leak Canaryを使えば、端末をAndroid Studioに接続してアプリを長時間監視する必要がないため、より長い実行時間でメモリリークを検出することができます。 Leak Canary は、メモリ リークが発生したときに通知を送信します。

Leak Canary の統合は実に簡単です。 アプリ レベルの build.gradle ファイルに以下を追加するだけです:

dependencies {
debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.5.1’
releaseCompile ‘com.squareup.leakcanary-android-no-op:1.5.1’
testCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.5.1’
}

次に、以下のコードをアプリケーションクラスに追加します。

@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// このプロセスはLeakCanaryのヒープ解析専用です。
// このプロセスでアプリをinitしてはいけません。
return;
}
LeakCanary.install(this);
// 通常のアプリinitコード・・
}

そして以上で、実行完了となります。

Detecting Possible Leaks With Infer

Infer は Facebook 社製の静的解析ツールで、ヌル ポインター例外やリソース リーク、注釈到達性、ロック ガードの欠落、並行処理の競合条件などを検出するのに役立ちます。 CIに追加して、あらゆる可能性のあるバグを克服するのに良いツールです。 また、オープンソースであるため、ツールの開発はまだ進化しています。 Inferの詳細については、クイック・スタート・ドキュメントを参照してください。

コメントする