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 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 タブにリークしたアクティビティが表示されるはずです。
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の詳細については、クイック・スタート・ドキュメントを参照してください。