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

What's hot (19)

PDF
第1回SIA研究会(例会)プレゼン資料
Tae Yoshida
 
PPTX
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Kohei Saito
 
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
 
PPTX
The Dangers of Cucumber
Þorgeir Ingvarsson
 
PDF
そのスプリントレビューは、機能してますか? #agile_hiyoko
Miho Nagase
 
PDF
ぼくと人間中心設計の七年間戦争
Kazumichi (Mario) Sakata
 
PDF
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
増田 亨
 
PDF
低レイヤー入門
demuyan
 
PDF
今どきの若手育成にひそむ3つの思いこみ
Mariko Hayashi
 
PDF
CEDEC2014 「ライブラリを作ってはいけない ~それでも作りたいあなたへのアドバイス~」
Yoshihiro Kurohata
 
PDF
Android起動周りのノウハウ
chancelab
 
PPTX
Jenkins使ってみた~Windows編~
Yuta Matsumura
 
PDF
第1回 GPT / ジェネレーティブAI 勉強会「ChatGPTでMML音楽を奏でてみた&LLMで思うこと」
嶋 是一 (Yoshikazu SHIMA)
 
PDF
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
PPTX
抽象的な教えを試行錯誤しながら解釈した DDD の実践レポート 大阪
hogesuzuki
 
PDF
Androidの新ビルドシステム
l_b__
 
PDF
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
 
PDF
メトリクスを用いたソフトウェア品質定量評価・改善 (GQM, Metrics, ET2013)
Hironori Washizaki
 
PDF
Goとテスト
Takuya Ueda
 
第1回SIA研究会(例会)プレゼン資料
Tae Yoshida
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Kohei Saito
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
 
The Dangers of Cucumber
Þorgeir Ingvarsson
 
そのスプリントレビューは、機能してますか? #agile_hiyoko
Miho Nagase
 
ぼくと人間中心設計の七年間戦争
Kazumichi (Mario) Sakata
 
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
増田 亨
 
低レイヤー入門
demuyan
 
今どきの若手育成にひそむ3つの思いこみ
Mariko Hayashi
 
CEDEC2014 「ライブラリを作ってはいけない ~それでも作りたいあなたへのアドバイス~」
Yoshihiro Kurohata
 
Android起動周りのノウハウ
chancelab
 
Jenkins使ってみた~Windows編~
Yuta Matsumura
 
第1回 GPT / ジェネレーティブAI 勉強会「ChatGPTでMML音楽を奏でてみた&LLMで思うこと」
嶋 是一 (Yoshikazu SHIMA)
 
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
抽象的な教えを試行錯誤しながら解釈した DDD の実践レポート 大阪
hogesuzuki
 
Androidの新ビルドシステム
l_b__
 
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank
 
メトリクスを用いたソフトウェア品質定量評価・改善 (GQM, Metrics, ET2013)
Hironori Washizaki
 
Goとテスト
Takuya Ueda
 

Viewers also liked (19)

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

Similar to 新版 OutOfMemoryErrorを知る (20)

PDF
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
griddb
 
KEY
SnapDishの事例
Fumikazu Kiyota
 
PDF
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
Takahiro Inoue
 
PDF
20180110 AI&ロボット勉強会 Deeplearning4J と時系列データの異常検知について
Kazuki Motohashi
 
PDF
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
 
PPTX
Ml based detection of users anomaly activities (20th OWASP Night Tokyo, Japan...
Yury Leonychev
 
PDF
Janog31 bof-pattern-sasaki-01
Ken SASAKI
 
PDF
MeeGo Seminar Winter Porting 20101209
Mitz Amano
 
PDF
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
DeNA
 
PPTX
cvsaisentan20141004 kanezaki
kanejaki
 
PPTX
local launch small language model of AI.
Takao Tetsuro
 
PDF
第9回 北関東3県工業高校生徒研究発表大会
Masaki Kobayashi
 
PPTX
20150909卒研進捗LT
mohemohe
 
PDF
2021 03-09-ac ri-nngen
直久 住川
 
PDF
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
Shinya Takamaeda-Y
 
KEY
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
Kenichi Kambara
 
PPT
NNKproject Japanese version
nao takatoshi
 
PPT
NNKproject Japanese version2
nao takatoshi
 
PPTX
Bait and switch
m ishizaki
 
PDF
研究動向から考えるx86/x64最適化手法
Takeshi Yamamuro
 
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
griddb
 
SnapDishの事例
Fumikazu Kiyota
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
Takahiro Inoue
 
20180110 AI&ロボット勉強会 Deeplearning4J と時系列データの異常検知について
Kazuki Motohashi
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
 
Ml based detection of users anomaly activities (20th OWASP Night Tokyo, Japan...
Yury Leonychev
 
Janog31 bof-pattern-sasaki-01
Ken SASAKI
 
MeeGo Seminar Winter Porting 20101209
Mitz Amano
 
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
DeNA
 
cvsaisentan20141004 kanezaki
kanejaki
 
local launch small language model of AI.
Takao Tetsuro
 
第9回 北関東3県工業高校生徒研究発表大会
Masaki Kobayashi
 
20150909卒研進捗LT
mohemohe
 
2021 03-09-ac ri-nngen
直久 住川
 
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
Shinya Takamaeda-Y
 
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
Kenichi Kambara
 
NNKproject Japanese version
nao takatoshi
 
NNKproject Japanese version2
nao takatoshi
 
Bait and switch
m ishizaki
 
研究動向から考えるx86/x64最適化手法
Takeshi Yamamuro
 
Ad

More from Masahiro Hidaka (11)

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

新版 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