SlideShare ist ein Scribd-Unternehmen logo
1 von 23
LeakCanaryで
メモリリーク調査
@nory_kaname
自己紹介
● 組み込みエンジニア
● 携帯電話開発(9年)
o ガラケー
o スマートフォン
● Android Developer(5年)
o 組み込み支援
o Frameworkカスタマイズ
o アプリケーション開発
● クックビズ株式会社所属
執筆
プロの力が身につく Androidプログラミングの教科書
本編
● LeakCanaryを使おう
o Leak検知時にNotification通知してくれる
● Android標準のメモリリークも存在する
● 困った時は、stackoverflowで聞け
● Githubにコントリビュートよろしく
絶対にLeakCanaryをいれろ!!
まとめ
なんでカナリア
● 毒ガス検知
o いわゆる炭鉱のカナリアは、炭鉱においてしばしば
発生するメタンや一酸化炭素といった窒息ガスや毒
ガス早期発見のための警報として使用された。本種
はつねにさえずっているので、異常発生に先駆けま
ずは鳴き声が止む。つまり危険の察知を目と耳で確
認できる所が重宝され、毒ガス検知に用いられた。
引用元:http://ja.wikipedia.org/wiki/カナリア
メモリリークを埋め込むやつら
● いまだに「Javaはメモリリークしない」と
信じてるプログラマ
● ライフサイクルを理解していない
● APIリファレンスを読まない
● 死んでほしいレベルの設計
close(),unregist(),recycle()など終了処理をして
いない、なんでもかんでもthisを渡す。
LeakCanaryとは
● Square社のライブラリ
o https://github.com/square/leakcanary
o メモリリーク検知ライブラリ
メモリリーク検知!!
Activity.onDestory時にメモリリークチェック
リーク検知すると、Notificationに通知
参照オブジェクトをリスト表示
処理はこんな感じ
● ApplicationクラスをLeakCanaryに渡す
(LeakCanary.java)
● ActivityLifecycleCallbacksを利用してActivity.onDestroy
をフック(ActivityRefWatcher.java)
● WeakReferenceで参照チェック (RefWatcher.java)
o Backgroundスレッド(Executor)でチェック実行
o GC実行、hprofファイル取得
 AndroidHeapDumper.java
 Debug.dumpHprofData()使用
導入が楽々!!
Step.1 ライブラリ追加
build.gradleに記載
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
導入が楽々!!
Step.2 Applicationクラスからcallする
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
Fragmentのリークチェック
LeakCanary.install()時にRefWatcherを取得
public class ExampleApplication extends Application {
private RefWatcher refWatcher;
public static RefWatcher getRefWatcher(Context context) {
ExampleApplication application =
(ExampleApplication)context.getApplicationContext();
return application.refWatcher;
}
@Override public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
Fragmentのリークチェック
Fragment.onDestroy()でwatchをcall
public abstract class BaseFragment extends Fragment {
@Override public void onDestroy() {
super.onDestroy();
RefWatcher refWatcher =
ExampleApplication.getRefWatcher(getActivity());
refWatcher.watch(this);
}
}
リークを検知すると
Notificationで通知してくれる
リークを検知すると
Activity起動、参照オブジェクトをリスト表示
Logcatに出力してくれる
logcatでの出力
05-10 18:13:00.377 9098-9965/com.ponnex.justdrive D/LeakCanary﹕ In com.ponnex.justdrive:1.0:1.
* com.ponnex.justdrive.DebuggingActivity has leaked:
* GC ROOT static android.support.v4.content.LocalBroadcastManager.mInstance
* references android.support.v4.content.LocalBroadcastManager.mReceivers
* references java.util.HashMap.table
* references array java.util.HashMap$HashMapEntry[].[51]
* references java.util.HashMap$HashMapEntry.key
* references com.ponnex.justdrive.DebuggingActivity$3.this$0 (anonymous class extends
android.content.BroadcastReceiver)
* leaks com.ponnex.justdrive.DebuggingActivity instance
* Reference Key: 4fea07d9-9369-4618-a8e0-9e63b3e1b908
* Device: samsung samsung GT-I9100 pa_i9100
* Android Version: 5.1.1 API: 22
* Durations: watch=5219ms, gc=244ms, heap dump=4978ms, analysis=19968ms
リーク出典:http://stackoverflow.com/questions/30150272/memory-leak-on-appcompatactivity-using-leakcanary
Android標準のリークもあるよ
logcatでの出力
* LEAK CAN BE IGNORED.
* jp.co.XXXXXXXXXXXXX has leaked:
* GC ROOT
android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper.mParentInputMeth
odManager
* references android.view.inputmethod.InputMethodManager.mCurRootView
* references com.android.internal.policy.impl.PhoneWindow$DecorView.mContext
* leaks jp.co.XXXXXXXXXXXXX has leaked instance
* Reference Key: 2807fc51-f9b4-4a1f-b6ba-33ba244189ec
* Device: LGE google Nexus 5 hammerhead
* Android Version: 5.1 API: 22
* Durations: watch=5062ms, gc=156ms, heap dump=1639ms, analysis=15535ms
IGNOREDと出力されます
Android標準のリークもあるよ
すでに確認されているリークは、AndroidExculedRefs.java
に記載
https://github.com/square/leakcanary/blob/master/leakcanary-
android/src/main/java/com/squareup/leakcanary/AndroidExcludedRefs.java
Android標準のリークを発見した
発見した場合、以下の手順でissueに登録
● leak trace情報を登録
● AOSPのソースを確認、何が起こったか調査。
https://github.com/android/platform_frameworks_base
● Fix済みかどうか、最新Android Verで確認。再現手順確
立
● AOSPのissue trackerに登録
https://code.google.com/p/android/issues/list
● AndroidExcludedRefs.javaを修正して、LeakCanaryに
pull request
ここに登録:
https://github.com/square/leakcanary/issues
リーク調査で困ったら
困ったらstackoverflowで聞け!!(公式)
私も回答します。
聞くだけじゃなくて、回答する側になろう
ご静聴、ありがとうございました。

Weitere ähnliche Inhalte

Was ist angesagt?

CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料SECCON Beginners
 
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営KLab Inc. / Tech
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術Yoshiaki Sugimoto
 
ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活Takaaki Umada
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こうShinnosuke Tokuda
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発Takafumi ONAKA
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
IoTデバイスセキュリティ
IoTデバイスセキュリティIoTデバイスセキュリティ
IoTデバイスセキュリティKentaro Mitsuyasu
 
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイントアップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイントkurikiyo
 
まじめに!できる!LT
まじめに!できる!LT まじめに!できる!LT
まじめに!できる!LT Akabane Hiroyuki
 
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...NTT DATA Technology & Innovation
 
シン モブ・プログラミング 第三形態
シン モブ・プログラミング 第三形態シン モブ・プログラミング 第三形態
シン モブ・プログラミング 第三形態atsushi nagata
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Masahito Zembutsu
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料SECCON Beginners
 

Was ist angesagt? (20)

CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
 
ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
IoTデバイスセキュリティ
IoTデバイスセキュリティIoTデバイスセキュリティ
IoTデバイスセキュリティ
 
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイントアップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイント
 
まじめに!できる!LT
まじめに!できる!LT まじめに!できる!LT
まじめに!できる!LT
 
Railsで作るBFFの功罪
Railsで作るBFFの功罪Railsで作るBFFの功罪
Railsで作るBFFの功罪
 
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 
シン モブ・プログラミング 第三形態
シン モブ・プログラミング 第三形態シン モブ・プログラミング 第三形態
シン モブ・プログラミング 第三形態
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
 

Mehr von baroqueworksdev

デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発baroqueworksdev
 
Team Development for iOS / Android
Team Development for iOS / Android Team Development for iOS / Android
Team Development for iOS / Android baroqueworksdev
 
Firebase analytics for_android _ i_os
Firebase analytics for_android _ i_osFirebase analytics for_android _ i_os
Firebase analytics for_android _ i_osbaroqueworksdev
 
Android m finger print(public)
Android m finger print(public)Android m finger print(public)
Android m finger print(public)baroqueworksdev
 
自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版baroqueworksdev
 
Sns連携アプリの準備
Sns連携アプリの準備Sns連携アプリの準備
Sns連携アプリの準備baroqueworksdev
 
Firefox勉強会 2nd gigs_資料
Firefox勉強会 2nd gigs_資料Firefox勉強会 2nd gigs_資料
Firefox勉強会 2nd gigs_資料baroqueworksdev
 
KeonとPeakを買ってみた
KeonとPeakを買ってみたKeonとPeakを買ってみた
KeonとPeakを買ってみたbaroqueworksdev
 

Mehr von baroqueworksdev (9)

デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発
 
Team Development for iOS / Android
Team Development for iOS / Android Team Development for iOS / Android
Team Development for iOS / Android
 
Firebase analytics for_android _ i_os
Firebase analytics for_android _ i_osFirebase analytics for_android _ i_os
Firebase analytics for_android _ i_os
 
Android m finger print(public)
Android m finger print(public)Android m finger print(public)
Android m finger print(public)
 
JUnit for android
JUnit for androidJUnit for android
JUnit for android
 
自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版
 
Sns連携アプリの準備
Sns連携アプリの準備Sns連携アプリの準備
Sns連携アプリの準備
 
Firefox勉強会 2nd gigs_資料
Firefox勉強会 2nd gigs_資料Firefox勉強会 2nd gigs_資料
Firefox勉強会 2nd gigs_資料
 
KeonとPeakを買ってみた
KeonとPeakを買ってみたKeonとPeakを買ってみた
KeonとPeakを買ってみた
 

Leak canaryで メモリリーク調査