SlideShare a Scribd company logo
1 of 26
Download to read offline
日本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

グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門ryosuke-kojima
 
居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おう居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おうHiroshi Nakagawa
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOpsMariOhbuchi
 
大規模データに基づく自然言語処理
大規模データに基づく自然言語処理大規模データに基づく自然言語処理
大規模データに基づく自然言語処理JunSuzuki21
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
三次元点群を取り扱うニューラルネットワークのサーベイ
三次元点群を取り扱うニューラルネットワークのサーベイ三次元点群を取り扱うニューラルネットワークのサーベイ
三次元点群を取り扱うニューラルネットワークのサーベイNaoya Chiba
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep LearningSeiya Tokui
 
動画認識における代表的なモデル・データセット(メタサーベイ)
動画認識における代表的なモデル・データセット(メタサーベイ)動画認識における代表的なモデル・データセット(メタサーベイ)
動画認識における代表的なモデル・データセット(メタサーベイ)cvpaper. challenge
 
【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAI
【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAI【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAI
【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAIssuser1bf283
 
非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出
非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出
非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出hoxo_m
 
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日Kitsukawa Yuki
 
[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object Detection
[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object Detection[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object Detection
[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object DetectionDeep Learning JP
 
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送Google Cloud Platform - Japan
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門Yuki Morishita
 
画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピ画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピTakahiro Kubo
 
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15Shuyo Nakatani
 
[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送
[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送
[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送Google Cloud Platform - Japan
 
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tatsuya Tojima
 

What's hot (20)

グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門
 
居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おう居場所を隠すために差分プライバシーを使おう
居場所を隠すために差分プライバシーを使おう
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
 
大規模データに基づく自然言語処理
大規模データに基づく自然言語処理大規模データに基づく自然言語処理
大規模データに基づく自然言語処理
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
三次元点群を取り扱うニューラルネットワークのサーベイ
三次元点群を取り扱うニューラルネットワークのサーベイ三次元点群を取り扱うニューラルネットワークのサーベイ
三次元点群を取り扱うニューラルネットワークのサーベイ
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep Learning
 
ごちうサーチ
ごちうサーチごちうサーチ
ごちうサーチ
 
動画認識における代表的なモデル・データセット(メタサーベイ)
動画認識における代表的なモデル・データセット(メタサーベイ)動画認識における代表的なモデル・データセット(メタサーベイ)
動画認識における代表的なモデル・データセット(メタサーベイ)
 
【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAI
【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAI【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAI
【東工大・鈴木良郎】「画像生成用StyleGANの技術」を「3D形状の生成」に活用!! 新車のボディ形状を生成するAI
 
非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出
非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出
非制約最小二乗密度比推定法 uLSIF を用いた外れ値検出
 
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日
 
[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object Detection
[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object Detection[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object Detection
[DL輪読会]YOLOv4: Optimal Speed and Accuracy of Object Detection
 
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう  2019年10月31日 放送
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
 
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
 
画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピ画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピ
 
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
 
[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送
[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送
[Cloud OnAir] BigQuery ML と AutoML Tables で はじめるマーケティング分析入門 2019年5月23日 放送
 
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
 

Viewers also liked

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

Viewers also liked (19)

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

Similar to 新版 OutOfMemoryErrorを知る

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

Similar to 新版 OutOfMemoryErrorを知る (20)

オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
オープンソースのビッグデータ・IoT向け スケールアウト型データベースGridDBとPython連携 〜GridDBとPythonと私〜
 
SnapDishの事例
SnapDishの事例SnapDishの事例
SnapDishの事例
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
20180110 AI&ロボット勉強会 Deeplearning4J と時系列データの異常検知について
20180110 AI&ロボット勉強会 Deeplearning4J と時系列データの異常検知について20180110 AI&ロボット勉強会 Deeplearning4J と時系列データの異常検知について
20180110 AI&ロボット勉強会 Deeplearning4J と時系列データの異常検知について
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
Ml based detection of users anomaly activities (20th OWASP Night Tokyo, Japan...
Ml based detection of users anomaly activities (20th OWASP Night Tokyo, Japan...Ml based detection of users anomaly activities (20th OWASP Night Tokyo, Japan...
Ml based detection of users anomaly activities (20th OWASP Night Tokyo, Japan...
 
Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01
 
MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209
 
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
 
cvsaisentan20141004 kanezaki
cvsaisentan20141004 kanezakicvsaisentan20141004 kanezaki
cvsaisentan20141004 kanezaki
 
local launch small language model of AI.
local launch small language model of AI.local launch small language model of AI.
local launch small language model of AI.
 
ImageJプラグインの作成:序論
ImageJプラグインの作成:序論ImageJプラグインの作成:序論
ImageJプラグインの作成:序論
 
第9回 北関東3県工業高校生徒研究発表大会
第9回 北関東3県工業高校生徒研究発表大会第9回 北関東3県工業高校生徒研究発表大会
第9回 北関東3県工業高校生徒研究発表大会
 
20150909卒研進捗LT
20150909卒研進捗LT20150909卒研進捗LT
20150909卒研進捗LT
 
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen
 
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステムオープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
 
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
 
NNKproject Japanese version
NNKproject Japanese versionNNKproject Japanese version
NNKproject Japanese version
 
NNKproject Japanese version2
NNKproject Japanese version2NNKproject Japanese version2
NNKproject Japanese version2
 
Bait and switch
Bait and switchBait and switch
Bait and switch
 

More from Masahiro Hidaka

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

More from Masahiro Hidaka (11)

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

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