Suche senden
Hochladen
Leak canaryで メモリリーク調査
•
Als PPTX, PDF herunterladen
•
3 gefällt mir
•
7,039 views
B
baroqueworksdev
Folgen
関西モバイルアプリ研究会 #2 http://kanmoba.connpass.com/event/14252/
Weniger lesen
Mehr lesen
Ingenieurwesen
Melden
Teilen
Melden
Teilen
1 von 23
Jetzt herunterladen
Empfohlen
アプリの鍵が消える時_Droid kaigi2018
アプリの鍵が消える時_Droid kaigi2018
ak_shio_555
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
2022のShowNetに向けて_ShowNet2021_conf_mini_5_2022_stm
2022のShowNetに向けて_ShowNet2021_conf_mini_5_2022_stm
Interop Tokyo ShowNet NOC Team
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
Elasticsearch
凝集度と責務
凝集度と責務
Toshinori Chiba
Windowsコンテナ入門
Windowsコンテナ入門
Kyohei Mizumoto
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
sonickun
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
Empfohlen
アプリの鍵が消える時_Droid kaigi2018
アプリの鍵が消える時_Droid kaigi2018
ak_shio_555
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
2022のShowNetに向けて_ShowNet2021_conf_mini_5_2022_stm
2022のShowNetに向けて_ShowNet2021_conf_mini_5_2022_stm
Interop Tokyo ShowNet NOC Team
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
Elasticsearch
凝集度と責務
凝集度と責務
Toshinori Chiba
Windowsコンテナ入門
Windowsコンテナ入門
Kyohei Mizumoto
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
sonickun
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
KLab Inc. / Tech
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
Yoshiaki Sugimoto
ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活
Takaaki Umada
Riverpodでテストを書こう
Riverpodでテストを書こう
Shinnosuke Tokuda
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
Takafumi ONAKA
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
IoTデバイスセキュリティ
IoTデバイスセキュリティ
Kentaro Mitsuyasu
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイント
kurikiyo
まじめに!できる!LT
まじめに!できる!LT
Akabane Hiroyuki
Railsで作るBFFの功罪
Railsで作るBFFの功罪
Recruit Lifestyle Co., Ltd.
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
NTT DATA Technology & Innovation
シン モブ・プログラミング 第三形態
シン モブ・プログラミング 第三形態
atsushi nagata
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
Masahito Zembutsu
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発
baroqueworksdev
Team Development for iOS / Android
Team Development for iOS / Android
baroqueworksdev
Weitere ähnliche Inhalte
Was ist angesagt?
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
KLab Inc. / Tech
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
Yoshiaki Sugimoto
ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活
Takaaki Umada
Riverpodでテストを書こう
Riverpodでテストを書こう
Shinnosuke Tokuda
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
Takafumi ONAKA
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
IoTデバイスセキュリティ
IoTデバイスセキュリティ
Kentaro Mitsuyasu
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイント
kurikiyo
まじめに!できる!LT
まじめに!できる!LT
Akabane Hiroyuki
Railsで作るBFFの功罪
Railsで作るBFFの功罪
Recruit Lifestyle Co., Ltd.
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
NTT DATA Technology & Innovation
シン モブ・プログラミング 第三形態
シン モブ・プログラミング 第三形態
atsushi nagata
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
Masahito Zembutsu
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
Was ist angesagt?
(20)
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活
Riverpodでテストを書こう
Riverpodでテストを書こう
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
IoTデバイスセキュリティ
IoTデバイスセキュリティ
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイント
まじめに!できる!LT
まじめに!できる!LT
Railsで作るBFFの功罪
Railsで作るBFFの功罪
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
シン モブ・プログラミング 第三形態
シン モブ・プログラミング 第三形態
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
Mehr von baroqueworksdev
デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発
baroqueworksdev
Team Development for iOS / Android
Team Development for iOS / Android
baroqueworksdev
Firebase analytics for_android _ i_os
Firebase analytics for_android _ i_os
baroqueworksdev
Android m finger print(public)
Android m finger print(public)
baroqueworksdev
JUnit for android
JUnit for android
baroqueworksdev
自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版
baroqueworksdev
Sns連携アプリの準備
Sns連携アプリの準備
baroqueworksdev
Firefox勉強会 2nd gigs_資料
Firefox勉強会 2nd gigs_資料
baroqueworksdev
KeonとPeakを買ってみた
KeonとPeakを買ってみた
baroqueworksdev
Mehr von baroqueworksdev
(9)
デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発
Team Development for iOS / Android
Team Development for iOS / Android
Firebase analytics for_android _ i_os
Firebase analytics for_android _ i_os
Android m finger print(public)
Android m finger print(public)
JUnit for android
JUnit for android
自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版
Sns連携アプリの準備
Sns連携アプリの準備
Firefox勉強会 2nd gigs_資料
Firefox勉強会 2nd gigs_資料
KeonとPeakを買ってみた
KeonとPeakを買ってみた
Leak canaryで メモリリーク調査
1.
LeakCanaryで メモリリーク調査 @nory_kaname
2.
自己紹介 ● 組み込みエンジニア ● 携帯電話開発(9年) o
ガラケー o スマートフォン ● Android Developer(5年) o 組み込み支援 o Frameworkカスタマイズ o アプリケーション開発 ● クックビズ株式会社所属
3.
執筆 プロの力が身につく Androidプログラミングの教科書
4.
本編
5.
● LeakCanaryを使おう o Leak検知時にNotification通知してくれる ●
Android標準のメモリリークも存在する ● 困った時は、stackoverflowで聞け ● Githubにコントリビュートよろしく 絶対にLeakCanaryをいれろ!! まとめ
6.
なんでカナリア ● 毒ガス検知 o いわゆる炭鉱のカナリアは、炭鉱においてしばしば 発生するメタンや一酸化炭素といった窒息ガスや毒 ガス早期発見のための警報として使用された。本種 はつねにさえずっているので、異常発生に先駆けま ずは鳴き声が止む。つまり危険の察知を目と耳で確 認できる所が重宝され、毒ガス検知に用いられた。 引用元:http://ja.wikipedia.org/wiki/カナリア
7.
メモリリークを埋め込むやつら ● いまだに「Javaはメモリリークしない」と 信じてるプログラマ ● ライフサイクルを理解していない ●
APIリファレンスを読まない ● 死んでほしいレベルの設計 close(),unregist(),recycle()など終了処理をして いない、なんでもかんでもthisを渡す。
8.
LeakCanaryとは ● Square社のライブラリ o https://github.com/square/leakcanary o
メモリリーク検知ライブラリ
9.
メモリリーク検知!! Activity.onDestory時にメモリリークチェック リーク検知すると、Notificationに通知 参照オブジェクトをリスト表示
10.
処理はこんな感じ ● ApplicationクラスをLeakCanaryに渡す (LeakCanary.java) ● ActivityLifecycleCallbacksを利用してActivity.onDestroy をフック(ActivityRefWatcher.java) ●
WeakReferenceで参照チェック (RefWatcher.java) o Backgroundスレッド(Executor)でチェック実行 o GC実行、hprofファイル取得 AndroidHeapDumper.java Debug.dumpHprofData()使用
11.
導入が楽々!! Step.1 ライブラリ追加 build.gradleに記載 dependencies { debugCompile
'com.squareup.leakcanary:leakcanary-android:1.3' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' }
12.
導入が楽々!! Step.2 Applicationクラスからcallする public class
ExampleApplication extends Application { @Override public void onCreate() { super.onCreate(); LeakCanary.install(this); } }
13.
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); }
14.
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); } }
15.
リークを検知すると Notificationで通知してくれる
16.
リークを検知すると Activity起動、参照オブジェクトをリスト表示
17.
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
18.
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と出力されます
19.
Android標準のリークもあるよ すでに確認されているリークは、AndroidExculedRefs.java に記載 https://github.com/square/leakcanary/blob/master/leakcanary- android/src/main/java/com/squareup/leakcanary/AndroidExcludedRefs.java
20.
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
21.
リーク調査で困ったら 困ったらstackoverflowで聞け!!(公式)
22.
私も回答します。 聞くだけじゃなくて、回答する側になろう
23.
ご静聴、ありがとうございました。
Jetzt herunterladen