SlideShare a Scribd company logo
1 of 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で聞け!!(公式)
私も回答します。
聞くだけじゃなくて、回答する側になろう
ご静聴、ありがとうございました。

More Related Content

What's hot

Docker 基本のおさらい
Docker 基本のおさらいDocker 基本のおさらい
Docker 基本のおさらいNaoki Nagazumi
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化Kumazaki Hiroki
 
Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み)
 Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み) Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み)
Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み)Sindharta Tanuwijaya
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]DeNA
 
SUPWAT 採用デック資料(PDF)
SUPWAT 採用デック資料(PDF)SUPWAT 採用デック資料(PDF)
SUPWAT 採用デック資料(PDF)ShotaroHATANAKA1
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Masahito Zembutsu
 
TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。tak9029
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャtorisoup
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜Unity Technologies Japan K.K.
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroiddemuyan
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能Yoshifumi Kawai
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
Keycloak & midPoint の紹介
Keycloak & midPoint の紹介Keycloak & midPoint の紹介
Keycloak & midPoint の紹介Hiroyuki Wada
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Masahito Zembutsu
 
ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話Tokoroten Nakayama
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 

What's hot (20)

Docker 基本のおさらい
Docker 基本のおさらいDocker 基本のおさらい
Docker 基本のおさらい
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み)
 Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み) Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み)
Behaviour Tree AI in Gentou Senki Griffon (幻塔戦記グリフォンでのBehaviour Treeの試み)
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
 
SUPWAT 採用デック資料(PDF)
SUPWAT 採用デック資料(PDF)SUPWAT 採用デック資料(PDF)
SUPWAT 採用デック資料(PDF)
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Keycloak & midPoint の紹介
Keycloak & midPoint の紹介Keycloak & midPoint の紹介
Keycloak & midPoint の紹介
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話ソーシャルゲームにレコメンドエンジンを導入した話
ソーシャルゲームにレコメンドエンジンを導入した話
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 

More from 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
 

More from 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で メモリリーク調査