Soumettre la recherche
Mettre en ligne
Leak canaryで メモリリーク調査
•
Télécharger en tant que PPTX, PDF
•
3 j'aime
•
7,039 vues
B
baroqueworksdev
Suivre
関西モバイルアプリ研究会 #2 http://kanmoba.connpass.com/event/14252/
Lire moins
Lire la suite
Ingénierie
Signaler
Partager
Signaler
Partager
1 sur 23
Télécharger maintenant
Recommandé
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
アニメーションとスキニングをBurstで独自実装する.pdf
アニメーションとスキニングをBurstで独自実装する.pdf
infinite_loop
async/await のしくみ
async/await のしくみ
信之 岩永
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid
demuyan
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
Yoshifumi Kawai
ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎とクラス設計への応用
nagise
例外設計における大罪
例外設計における大罪
Takuto Wada
これからの「async/await」の話をしよう
これからの「async/await」の話をしよう
Kouji Matsui
Recommandé
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
アニメーションとスキニングをBurstで独自実装する.pdf
アニメーションとスキニングをBurstで独自実装する.pdf
infinite_loop
async/await のしくみ
async/await のしくみ
信之 岩永
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid
demuyan
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
Yoshifumi Kawai
ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎とクラス設計への応用
nagise
例外設計における大罪
例外設計における大罪
Takuto Wada
これからの「async/await」の話をしよう
これからの「async/await」の話をしよう
Kouji Matsui
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
増田 亨
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
Yoshifumi Kawai
Inside FastEnum
Inside FastEnum
Takaaki Suzuki
OSセキュリティチュートリアル
OSセキュリティチュートリアル
Kuniyasu Suzaki
Kotlinアンチパターン
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
信之 岩永
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
裕士 常田
5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ
Kenji Tanaka
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
モノビット エンジン
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
gree_tech
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
U-dai Yokoyama
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
torisoup
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?
KLab Inc. / Tech
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発
baroqueworksdev
Team Development for iOS / Android
Team Development for iOS / Android
baroqueworksdev
Contenu connexe
Tendances
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
増田 亨
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
Yoshifumi Kawai
Inside FastEnum
Inside FastEnum
Takaaki Suzuki
OSセキュリティチュートリアル
OSセキュリティチュートリアル
Kuniyasu Suzaki
Kotlinアンチパターン
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
信之 岩永
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
裕士 常田
5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ
Kenji Tanaka
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
モノビット エンジン
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
gree_tech
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
U-dai Yokoyama
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
torisoup
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?
KLab Inc. / Tech
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
Tendances
(20)
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
Inside FastEnum
Inside FastEnum
OSセキュリティチュートリアル
OSセキュリティチュートリアル
Kotlinアンチパターン
Kotlinアンチパターン
C#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
いまどきの組込みOSの ZephyrRTOSと OpenThreadを Arduino環境で遊んでみる
5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
RenderTextureの正しいα値は?
RenderTextureの正しいα値は?
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
Plus de 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
Plus de 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.
ご静聴、ありがとうございました。
Télécharger maintenant