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

Contenu connexe

Tendances

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす増田 亨
 
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthYoshifumi Kawai
 
OSセキュリティチュートリアル
OSセキュリティチュートリアルOSセキュリティチュートリアル
OSセキュリティチュートリアルKuniyasu Suzaki
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること信之 岩永
 
いまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみる
いまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみるいまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみる
いまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみる裕士 常田
 
5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャKenji Tanaka
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~モノビット エンジン
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~gree_tech
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しようUnityTechnologiesJapan002
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」U-dai Yokoyama
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介torisoup
 
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?RenderTextureの正しいα値は?
RenderTextureの正しいα値は?KLab Inc. / Tech
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理KageShiron
 

Tendances (20)

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
 
Inside FastEnum
Inside FastEnumInside FastEnum
Inside FastEnum
 
OSセキュリティチュートリアル
OSセキュリティチュートリアルOSセキュリティチュートリアル
OSセキュリティチュートリアル
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
いまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみる
いまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみるいまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみる
いまどきの組込みOSの​ ZephyrRTOSと​ OpenThreadを​ Arduino環境で遊んでみる
 
5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?RenderTextureの正しいα値は?
RenderTextureの正しいα値は?
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 

Plus de 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
 

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