SlideShare a Scribd company logo
日本Androidの会
日高正博
1
 組込エンジニアです
 Androidとか。関西が生息圏でした。
 techbooster.org みてね
 本もあるよ
2
Twitter
Account
@mhidaka
 2010年5月の関西支部勉強会での発表が初版
◦ 思いのほか「OutOfMemoryErrorを知る」PDFが浸透してた。
古い内容、補足したい項目が多い
さすがに3年経つと…というわけで再度まとめました。
 ARが流行する兆し
◦ Androidの性能は向上、以前よりOOMは発生しにくい
◦ 性能向上はOpenCVなど画像処理の利用を推進
今でもメモリ管理は重要な技術
3
4
Androidのメモリ管理Androidのメモリ管理
• Dalvik VM、Linuxのメモリ管理の役割分担
• Java HeapとNative Heapの考え方
• AndroidのGC、Java Heap量の情報
メモリ使用の最適化メモリ使用の最適化
• Bitmapを使う上での注意点と最適化手法
• アクティビティ、ライフサイクルのメモリリーク予防法(未完)
• OOMさせないキャッシュシステム(未完)
5
6
 メモリ不足に陥ったときに発生
◦ エラー発生は即死せざるを得ない。プログラマの敵。
7
05-14 17:16:45.035: INFO/ActivityManager(51): Config changed:
{ scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1
orien=1 layout=18}
05-14 17:16:45.075: ERROR/dalvikvm-heap(187): 2457600-byte external
allocation too large for this process.
05-14 17:16:45.075: ERROR/(187): VM won't let us allocate 2457600
bytes…省略…
05-14 17:16:45.204: ERROR/AndroidRuntime(187):
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
OOMを回避するにはAndroidのメモリ管理を知るOOMを回避するにはAndroidのメモリ管理を知る
レジスタベースの仮想マシンレジスタベースの仮想マシン
• Dan Bornsteinおよび Google 社のエンジニアによりAndroidプラットフォームのために
設計・開発
低メモリ環境に対して最適化低メモリ環境に対して最適化
• システムプロセス Zygoteによる効率的なVMインスタンス作成
VMインスタンスの同時起動VMインスタンスの同時起動
• プロセス分離(サンドボックス)/メモリ管理/スレッドサポート
Java VM?Java VM?
• 動作するバイトコードがJavaバイトコードではない
• 独自のDex形式。厳密にはJVMではない
8
Wikipedia:dalvik
 JavaHeap
◦ アプリ(VM)ごとに管理される
◦ VM内でスレッドを作った場合は
スレッドでも共有されるメモリ空間
◦ (※システム依存)
 NativeHeap
◦ JITコンパイル展開用バッファや
◦ DalvikVMsystemの利用
 Linux
◦ アプリからはアクセスできない特別な
メモリ領域。Kernel空間
2010/5/15 9日本Androidの会/日高正博
インスタンス化したObj
Java Heap
クラス
インスタンス化したObj
NativeHeap
Jitバッファ
Dalvik VM利用分
Linux
Kernel空間
メモリ管理 概念図
10
インスタンス化したObj
Java Heap
クラス
インスタンス化したObj
NativeHeap
Jitバッファ
Dalvik VM利用分
Linux
Kernel空間
メモリ管理 概念図
<管理可能領域>
Dalvikからみて管理
可能なメモリ領域。
=Java Heap
<管理不可>
DalvikからみてGC
対象外領域。
=NativeHeap+System
Area
管理不可部分を指して
NativeHeap
もあるので注意
管理不可部分を指して
NativeHeapと書く記事
もあるので注意
<ユーザー空間>
Linuxからみてプロセスごと
管理されるメモリ領域
<カーネル空間>
Linuxカーネルが管
理するメモリ空間
プロセスがKillされたら
占用していたメモリ
(ユーザー空間)は解放
される
プロセスがKillされたら
占用していたメモリ
(ユーザー空間)は解放
される
アプリ層から見ると カーネルから見ると
ユーザー空間
Androidアプリ
(プロセスA)
JavaHeap
NativeHeap
Androidアプリ
(プロセスB)
JavaHeap
NativeHeap
Dalvik
(プロセスC)
Dalvik
管理Heap
Linuxアプリ
(プロセスD)
Heap
11
Linuxカーネル空間
 マークスイープGC(BitmapMarking手法)
◦ 3つのフェーズでメモリを管理
 マーク
◦ オブジェクト使用をマーク用テーブルで管理
 スイープ
◦ 未使用オブジェクトがあれば掃除する
 アロケーション
◦ メモリ確保要求にあわせて空き容量を探す
12
05-14 17:43:25.916: DEBUG/dalvikvm(51):05-14 17:43:25.916: DEBUG/dalvikvm(51):
GC freed 637 objects / 29528 bytes in 86ms
 GC実装
◦ Full GCからコンカレントGCに変更(Android 2.3)
“Stop the World”の短縮
 端末性能の向上に伴い、Java Heap領域が拡張
◦ 初期heapサイズ(2MB)から
◦ Android 1.x (G1) : 16MB
◦ Android 2.x (Droid, other) : 24MB / 32MB
◦ Android 3.x (Xoom) :48MB
◦ Android 4.x (Galaxy Nexus) :64MB
◦
◦ ※あくまでJava Heapのサイズです。Native Heapについて
Dalvikは関知していない(Linuxがプロセスごとに管理)
13
 HoneyComb(API Level 11)以降で使用可能
◦ メモリを大量に消費するアプリのために用意
 Java Heapを拡張
◦ 最大256MB(Android 4.xの場合。システム依存)
14
AndroidManifest.xml
android:largeHeap="true"
ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
int heapSize = am.getLargeMemoryClass();
int largeHeapSize = am.getLargeMemoryClass();
Log.d("heap","Normal:" + heapSize + " Large:" + largeHeapSize);
Sample
http://developer.android.com/reference/android/app/ActivityManager.html
Java HeapのサイズJava Heapのサイズ
•初期サイズが2MB、最大サイズが16~64MB(※システム依存)
•Android 3.x~ ではlargeHeapが存在、256MBまで拡張
OutOfMemoryErrorの条件OutOfMemoryErrorの条件
•メモリアロケーション時に不足を検出したらスローされる。
Java Heap内で(GCしても)要求サイズ分の空きが無ければ発生
JNIでのメモリリソース消費JNIでのメモリリソース消費
•JNI内のメモリ確保はJava Heapは利用せずにNative Heapが消費される
•Dalvikでは管理できず、開発者がmalloc/freeする
15
解析と最適化アプローチ
16
 DDMSパースペクティブでVM Heap(Java Heap)が
確認できる
17http://android-developers.blogspot.jp/2011/03/memory-analysis-for-android.html
18
android-sdk¥tools¥ddms.bat
 Android 3.x以降、BitmapはJava Heapで確保
◦ Android 2.3まではNative Heapで確保していた
 変更によるメリット
◦ DDMSによるJava Heap解析の対象になる
19
 public class BitmapFactory extends Object
 android.graphics.BitmapFactory
 Class Overview
◦ Creates Bitmap objects from various sources, including files,
streams, and byte-arrays.
 Public Methods
◦ static Bitmap decodeFile(String pathName,
BitmapFactory.Options opts) Decode a file path into a
bitmap.
◦ static Bitmap decodeResource(Resources res, int id)
Synonym for decodeResource(Resources, int,
android.graphics.BitmapFactory.Options) will null Options.
20
 Free up the memory associated with this bitmap's
pixels, and mark the bitmap as "dead", meaning
it will throw an exception if getPixels() or
setPixels() is called, and will draw nothing.
 isRecycled() Returns true if this bitmap has been
recycled.
 「今は使わない」というタイミングで呼んでおくと
メモリが不足したときに自動的に解放してくれる
21
 nativeDecodeStream
- doDecode
- decoder->decode(stream, bitmap,
prefConfig, decodeMode)
22
 SkJPEGImageDecoder::onDecode
- this->allocPixelRef(bm, NULL)
- SkBitmap::allocPixels
- HeapAllocator::allocPixelRef
- sk_malloc_flags(size.get32(), 0)
sk_malloc_flags
- void* p = malloc(size);
 javaBitmap = env->GetObjectField(options,
gOptions_bitmapFieldID);
 nativeDecodeStream
- doDecode
- decoder->decode(stream, bitmap,
prefConfig, decodeMode, javaBitmap != NULL))
23
Bitmapの取り扱い
• Recycle/IsRecycle を活用
• BitmapFactory.Options. inPurgeable
• Bitmap.Config に ARGB_8888 からRGB_565 にするだけでメモリ使用量半分に。
画像リソース一般
• 画像など大きなリソースはDrawableをデバイスごとに用意。
大画面向けのリソース(xxhdpiなど)の縮小処理はメモリを余分に使う
• JavaHeapは使い終わったオブジェクト参照を残さない
→ setDrawableメソッドのnull代入
→ Activityコンテキストを使いまわさない(Applicationコンテキストで代用)
• System.gc()をおまじないに使う
24
25
GC Bitmap LargeHeap HeapSize LruCache
1.5 Full GC Native × 16MB
1.6 Full GC Native × 16MB ○(SupportLib)
2.x Full GC Native × 24,32MB ○(SupportLib)
2.3 Concurrent GC Native × 48MB ○(SupportLib)
3.X Concurrent GC Java Heap ○(256MB) 48MB ○
4.x Concurrent GC Java Heap ○(256MB) 64MB ○
5.x
 ご清聴ありがとうございました
◦ 他にも書きたかったこと
 メモリリークの考え方
 エラーは取りましょう、とかく(捕まえてエラーを修正するための情報
とする)
 Activityライフサイクル
 メモリリークのおきやすい箇所
ライフサイクル、コンフィグの注意する箇所
 onLowMemoryが追加
 WeakRefの弱体化とLruCacheの使用推奨
 キャッシュの考え方
26

More Related Content

PDF
【Unite 2018 Tokyo】『CARAVAN STORIES』のアセットバンドル事例
PPTX
Docker Tokyo
PDF
20200303 AWS Black Belt Online Seminar AWS Cloud Development Kit (CDK)
PDF
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
2023年はTiDBの時代!
PDF
「3Dゲームをおもしろくする技術 」のいろいろな読み方
PPTX
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
【Unite 2018 Tokyo】『CARAVAN STORIES』のアセットバンドル事例
Docker Tokyo
20200303 AWS Black Belt Online Seminar AWS Cloud Development Kit (CDK)
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
2023年はTiDBの時代!
「3Dゲームをおもしろくする技術 」のいろいろな読み方
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]

What's hot (20)

PDF
Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜
PPTX
CGWORLD Creative Conference 2017 「アセットの共有を円滑にするリグの作法」
PPTX
DeNAの最新のマスタデータ管理システム Oyakata の全容
PDF
なぜあなたのプロジェクトのDevSecOpsは形骸化するのか(CloudNative Security Conference 2022)
PDF
ここが良かったDatadog
PDF
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
PDF
ChatGPTは思ったほど賢くない
PDF
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
PDF
ログ管理のベストプラクティス
PDF
Mayaカメラデータunityインストール
PPTX
BuildKitによる高速でセキュアなイメージビルド
PPTX
イベント・ソーシングを知る
PDF
Unity開発で使える設計の話+Zenjectの紹介
PDF
ユーザーストーリー駆動開発で行こう。
PDF
CyberAgentのインフラについて メディア事業編 #catechchallenge
PDF
Elasticsearchを使うときの注意点 公開用スライド
PDF
4つの戦犯から考えるサービスづくりの失敗
PDF
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
PPTX
HttpClient詳解、或いは非同期の落とし穴について
PPTX
FINAL FANTASY Record Keeperのマスターデータを支える技術
Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜
CGWORLD Creative Conference 2017 「アセットの共有を円滑にするリグの作法」
DeNAの最新のマスタデータ管理システム Oyakata の全容
なぜあなたのプロジェクトのDevSecOpsは形骸化するのか(CloudNative Security Conference 2022)
ここが良かったDatadog
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ChatGPTは思ったほど賢くない
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
ログ管理のベストプラクティス
Mayaカメラデータunityインストール
BuildKitによる高速でセキュアなイメージビルド
イベント・ソーシングを知る
Unity開発で使える設計の話+Zenjectの紹介
ユーザーストーリー駆動開発で行こう。
CyberAgentのインフラについて メディア事業編 #catechchallenge
Elasticsearchを使うときの注意点 公開用スライド
4つの戦犯から考えるサービスづくりの失敗
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
HttpClient詳解、或いは非同期の落とし穴について
FINAL FANTASY Record Keeperのマスターデータを支える技術
Ad

Viewers also liked (19)

PDF
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
PDF
Fxos lt1 shino_merry_mhidaka
PDF
Gecko入門 - Introduction to Gecko -
PDF
失敗しない!Androidアプリ開発最前線!
PDF
DroidKaigi 2017 welcometalk DAY01
PPT
RecentApps
PDF
Google I/O 2011 HowToADK
PDF
Androidの衝撃 クラウドで進化する組込システム
PDF
Android Studio First Step Guide
PDF
Developers Summit 2017 17-A-7 執筆を支える技術と技術書のトレンド
PDF
Android bluetooth
PDF
Android端末の選び方
PDF
DroidKaigi - Welcome talk
PDF
Anroid Design Guide 3つのポイント
PDF
Androidアプリのストレージ戦略
PDF
DroidKaigi 2017 welcometalk DAY02
PDF
Google I/O 報告会 Overview
PDF
Android Things Latest News / Aug 25, 2017
PDF
書籍制作でReVIEWを使う実践ワークフロー
iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
Fxos lt1 shino_merry_mhidaka
Gecko入門 - Introduction to Gecko -
失敗しない!Androidアプリ開発最前線!
DroidKaigi 2017 welcometalk DAY01
RecentApps
Google I/O 2011 HowToADK
Androidの衝撃 クラウドで進化する組込システム
Android Studio First Step Guide
Developers Summit 2017 17-A-7 執筆を支える技術と技術書のトレンド
Android bluetooth
Android端末の選び方
DroidKaigi - Welcome talk
Anroid Design Guide 3つのポイント
Androidアプリのストレージ戦略
DroidKaigi 2017 welcometalk DAY02
Google I/O 報告会 Overview
Android Things Latest News / Aug 25, 2017
書籍制作でReVIEWを使う実践ワークフロー
Ad

Similar to 新版 OutOfMemoryErrorを知る (17)

PPTX
勉強会資料Out ofmemory
PPTX
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
PDF
“夏前にすぐに痩せるRam diet!” もしくは 「老頭児組込みエンジニアの苦悩」 (中継無し) パート1 公開版
PDF
How to improve performance
PPTX
初めてのAndroid開発
PDF
Android4.2徹底解剖!
PPTX
高度に最適化された移植可能なメモリマネージャ
PDF
Android gameprogramming
PDF
AndroidでDIxAOP
PPT
Javaメモリ勉強会
PDF
ABC2016Spring Androidアプリ実装アンチパターン(暫定)
PPTX
JavaOne報告会 LT資料
PDF
Android0422
PDF
アプリリリース後に後悔しないための20のこと
ODP
コンカレントGc
ODP
dalvikのGCをのぞいてみた
PDF
Android api-levels
勉強会資料Out ofmemory
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
“夏前にすぐに痩せるRam diet!” もしくは 「老頭児組込みエンジニアの苦悩」 (中継無し) パート1 公開版
How to improve performance
初めてのAndroid開発
Android4.2徹底解剖!
高度に最適化された移植可能なメモリマネージャ
Android gameprogramming
AndroidでDIxAOP
Javaメモリ勉強会
ABC2016Spring Androidアプリ実装アンチパターン(暫定)
JavaOne報告会 LT資料
Android0422
アプリリリース後に後悔しないための20のこと
コンカレントGc
dalvikのGCをのぞいてみた
Android api-levels

More from Masahiro Hidaka (10)

PDF
DroidKaigi 2019 WelcomeTalk
PDF
Google I/O 2018 KeynoteとDeveloper KeynoteのOverview
PDF
DroidKaigi 2018 Android Back to the Future
PDF
DroidKaigi 2018 WelcomeTalk
PDF
KotlinConf Recap
PDF
コミュニティ活動と企業の相互作用 ~コミュニティへの貢献と組織活動への還元~
PDF
Google I/O 2017 Extended: Android O And Android Studio
PDF
Devsumi2013 15-C-1 実践!スマホアプリのマネタイズ!! ~マーケット把握術と iPhone&Androidプログラミングテクニック~
PDF
Android カスタムROMの作り方
PDF
ETWest2012 コミュニティセッション
DroidKaigi 2019 WelcomeTalk
Google I/O 2018 KeynoteとDeveloper KeynoteのOverview
DroidKaigi 2018 Android Back to the Future
DroidKaigi 2018 WelcomeTalk
KotlinConf Recap
コミュニティ活動と企業の相互作用 ~コミュニティへの貢献と組織活動への還元~
Google I/O 2017 Extended: Android O And Android Studio
Devsumi2013 15-C-1 実践!スマホアプリのマネタイズ!! ~マーケット把握術と iPhone&Androidプログラミングテクニック~
Android カスタムROMの作り方
ETWest2012 コミュニティセッション

新版 OutOfMemoryErrorを知る

  • 2.  組込エンジニアです  Androidとか。関西が生息圏でした。  techbooster.org みてね  本もあるよ 2 Twitter Account @mhidaka
  • 3.  2010年5月の関西支部勉強会での発表が初版 ◦ 思いのほか「OutOfMemoryErrorを知る」PDFが浸透してた。 古い内容、補足したい項目が多い さすがに3年経つと…というわけで再度まとめました。  ARが流行する兆し ◦ Androidの性能は向上、以前よりOOMは発生しにくい ◦ 性能向上はOpenCVなど画像処理の利用を推進 今でもメモリ管理は重要な技術 3
  • 4. 4
  • 5. Androidのメモリ管理Androidのメモリ管理 • Dalvik VM、Linuxのメモリ管理の役割分担 • Java HeapとNative Heapの考え方 • AndroidのGC、Java Heap量の情報 メモリ使用の最適化メモリ使用の最適化 • Bitmapを使う上での注意点と最適化手法 • アクティビティ、ライフサイクルのメモリリーク予防法(未完) • OOMさせないキャッシュシステム(未完) 5
  • 6. 6
  • 7.  メモリ不足に陥ったときに発生 ◦ エラー発生は即死せざるを得ない。プログラマの敵。 7 05-14 17:16:45.035: INFO/ActivityManager(51): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1 orien=1 layout=18} 05-14 17:16:45.075: ERROR/dalvikvm-heap(187): 2457600-byte external allocation too large for this process. 05-14 17:16:45.075: ERROR/(187): VM won't let us allocate 2457600 bytes…省略… 05-14 17:16:45.204: ERROR/AndroidRuntime(187): java.lang.OutOfMemoryError: bitmap size exceeds VM budget OOMを回避するにはAndroidのメモリ管理を知るOOMを回避するにはAndroidのメモリ管理を知る
  • 8. レジスタベースの仮想マシンレジスタベースの仮想マシン • Dan Bornsteinおよび Google 社のエンジニアによりAndroidプラットフォームのために 設計・開発 低メモリ環境に対して最適化低メモリ環境に対して最適化 • システムプロセス Zygoteによる効率的なVMインスタンス作成 VMインスタンスの同時起動VMインスタンスの同時起動 • プロセス分離(サンドボックス)/メモリ管理/スレッドサポート Java VM?Java VM? • 動作するバイトコードがJavaバイトコードではない • 独自のDex形式。厳密にはJVMではない 8 Wikipedia:dalvik
  • 9.  JavaHeap ◦ アプリ(VM)ごとに管理される ◦ VM内でスレッドを作った場合は スレッドでも共有されるメモリ空間 ◦ (※システム依存)  NativeHeap ◦ JITコンパイル展開用バッファや ◦ DalvikVMsystemの利用  Linux ◦ アプリからはアクセスできない特別な メモリ領域。Kernel空間 2010/5/15 9日本Androidの会/日高正博 インスタンス化したObj Java Heap クラス インスタンス化したObj NativeHeap Jitバッファ Dalvik VM利用分 Linux Kernel空間 メモリ管理 概念図
  • 10. 10 インスタンス化したObj Java Heap クラス インスタンス化したObj NativeHeap Jitバッファ Dalvik VM利用分 Linux Kernel空間 メモリ管理 概念図 <管理可能領域> Dalvikからみて管理 可能なメモリ領域。 =Java Heap <管理不可> DalvikからみてGC 対象外領域。 =NativeHeap+System Area 管理不可部分を指して NativeHeap もあるので注意 管理不可部分を指して NativeHeapと書く記事 もあるので注意 <ユーザー空間> Linuxからみてプロセスごと 管理されるメモリ領域 <カーネル空間> Linuxカーネルが管 理するメモリ空間 プロセスがKillされたら 占用していたメモリ (ユーザー空間)は解放 される プロセスがKillされたら 占用していたメモリ (ユーザー空間)は解放 される アプリ層から見ると カーネルから見ると
  • 12.  マークスイープGC(BitmapMarking手法) ◦ 3つのフェーズでメモリを管理  マーク ◦ オブジェクト使用をマーク用テーブルで管理  スイープ ◦ 未使用オブジェクトがあれば掃除する  アロケーション ◦ メモリ確保要求にあわせて空き容量を探す 12 05-14 17:43:25.916: DEBUG/dalvikvm(51):05-14 17:43:25.916: DEBUG/dalvikvm(51): GC freed 637 objects / 29528 bytes in 86ms
  • 13.  GC実装 ◦ Full GCからコンカレントGCに変更(Android 2.3) “Stop the World”の短縮  端末性能の向上に伴い、Java Heap領域が拡張 ◦ 初期heapサイズ(2MB)から ◦ Android 1.x (G1) : 16MB ◦ Android 2.x (Droid, other) : 24MB / 32MB ◦ Android 3.x (Xoom) :48MB ◦ Android 4.x (Galaxy Nexus) :64MB ◦ ◦ ※あくまでJava Heapのサイズです。Native Heapについて Dalvikは関知していない(Linuxがプロセスごとに管理) 13
  • 14.  HoneyComb(API Level 11)以降で使用可能 ◦ メモリを大量に消費するアプリのために用意  Java Heapを拡張 ◦ 最大256MB(Android 4.xの場合。システム依存) 14 AndroidManifest.xml android:largeHeap="true" ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE); int heapSize = am.getLargeMemoryClass(); int largeHeapSize = am.getLargeMemoryClass(); Log.d("heap","Normal:" + heapSize + " Large:" + largeHeapSize); Sample http://developer.android.com/reference/android/app/ActivityManager.html
  • 15. Java HeapのサイズJava Heapのサイズ •初期サイズが2MB、最大サイズが16~64MB(※システム依存) •Android 3.x~ ではlargeHeapが存在、256MBまで拡張 OutOfMemoryErrorの条件OutOfMemoryErrorの条件 •メモリアロケーション時に不足を検出したらスローされる。 Java Heap内で(GCしても)要求サイズ分の空きが無ければ発生 JNIでのメモリリソース消費JNIでのメモリリソース消費 •JNI内のメモリ確保はJava Heapは利用せずにNative Heapが消費される •Dalvikでは管理できず、開発者がmalloc/freeする 15
  • 17.  DDMSパースペクティブでVM Heap(Java Heap)が 確認できる 17http://android-developers.blogspot.jp/2011/03/memory-analysis-for-android.html
  • 19.  Android 3.x以降、BitmapはJava Heapで確保 ◦ Android 2.3まではNative Heapで確保していた  変更によるメリット ◦ DDMSによるJava Heap解析の対象になる 19
  • 20.  public class BitmapFactory extends Object  android.graphics.BitmapFactory  Class Overview ◦ Creates Bitmap objects from various sources, including files, streams, and byte-arrays.  Public Methods ◦ static Bitmap decodeFile(String pathName, BitmapFactory.Options opts) Decode a file path into a bitmap. ◦ static Bitmap decodeResource(Resources res, int id) Synonym for decodeResource(Resources, int, android.graphics.BitmapFactory.Options) will null Options. 20
  • 21.  Free up the memory associated with this bitmap's pixels, and mark the bitmap as "dead", meaning it will throw an exception if getPixels() or setPixels() is called, and will draw nothing.  isRecycled() Returns true if this bitmap has been recycled.  「今は使わない」というタイミングで呼んでおくと メモリが不足したときに自動的に解放してくれる 21
  • 22.  nativeDecodeStream - doDecode - decoder->decode(stream, bitmap, prefConfig, decodeMode) 22  SkJPEGImageDecoder::onDecode - this->allocPixelRef(bm, NULL) - SkBitmap::allocPixels - HeapAllocator::allocPixelRef - sk_malloc_flags(size.get32(), 0) sk_malloc_flags - void* p = malloc(size);
  • 23.  javaBitmap = env->GetObjectField(options, gOptions_bitmapFieldID);  nativeDecodeStream - doDecode - decoder->decode(stream, bitmap, prefConfig, decodeMode, javaBitmap != NULL)) 23
  • 24. Bitmapの取り扱い • Recycle/IsRecycle を活用 • BitmapFactory.Options. inPurgeable • Bitmap.Config に ARGB_8888 からRGB_565 にするだけでメモリ使用量半分に。 画像リソース一般 • 画像など大きなリソースはDrawableをデバイスごとに用意。 大画面向けのリソース(xxhdpiなど)の縮小処理はメモリを余分に使う • JavaHeapは使い終わったオブジェクト参照を残さない → setDrawableメソッドのnull代入 → Activityコンテキストを使いまわさない(Applicationコンテキストで代用) • System.gc()をおまじないに使う 24
  • 25. 25 GC Bitmap LargeHeap HeapSize LruCache 1.5 Full GC Native × 16MB 1.6 Full GC Native × 16MB ○(SupportLib) 2.x Full GC Native × 24,32MB ○(SupportLib) 2.3 Concurrent GC Native × 48MB ○(SupportLib) 3.X Concurrent GC Java Heap ○(256MB) 48MB ○ 4.x Concurrent GC Java Heap ○(256MB) 64MB ○ 5.x
  • 26.  ご清聴ありがとうございました ◦ 他にも書きたかったこと  メモリリークの考え方  エラーは取りましょう、とかく(捕まえてエラーを修正するための情報 とする)  Activityライフサイクル  メモリリークのおきやすい箇所 ライフサイクル、コンフィグの注意する箇所  onLowMemoryが追加  WeakRefの弱体化とLruCacheの使用推奨  キャッシュの考え方 26