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

SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
 
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
Yahoo!デベロッパーネットワーク
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
オブジェクト指向の入門資料
オブジェクト指向の入門資料オブジェクト指向の入門資料
オブジェクト指向の入門資料
KubotaHideya
 
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
NTT DATA Technology & Innovation
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略
Yasutomo Uemori
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTT DATA Technology & Innovation
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
Yoshifumi Kawai
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤
Yu Otsubo
 
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャJJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
Kaname Motoyama
 
Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話
健一 辰濱
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
 
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
健一 辰濱
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 

What's hot (20)

SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
オブジェクト指向の入門資料
オブジェクト指向の入門資料オブジェクト指向の入門資料
オブジェクト指向の入門資料
 
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤
 
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャJJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
 
Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 

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_mhidaka
Masahiro 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 DAY01
Masahiro Hidaka
 
RecentApps
RecentAppsRecentApps
RecentApps
Masahiro 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 Guide
Masahiro 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 bluetooth
Android bluetoothAndroid bluetooth
Android bluetooth
Masahiro Hidaka
 
Android端末の選び方
Android端末の選び方Android端末の選び方
Android端末の選び方
Masahiro Hidaka
 
DroidKaigi - Welcome talk
DroidKaigi - Welcome talkDroidKaigi - Welcome talk
DroidKaigi - Welcome talk
Masahiro 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 DAY02
Masahiro Hidaka
 
Google I/O 報告会 Overview
Google I/O 報告会 OverviewGoogle I/O 報告会 Overview
Google I/O 報告会 Overview
Masahiro 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, 2017
Masahiro 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
 
SnapDishの事例
SnapDishの事例SnapDishの事例
SnapDishの事例
Fumikazu Kiyota
 
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-01
Ken SASAKI
 
MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209MeeGo Seminar Winter Porting 20101209
MeeGo Seminar Winter Porting 20101209
Mitz Amano
 
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
運用中のゲームにAIを導入するには〜プロジェクト推進・ユースケース・運用〜 [DeNA TechCon 2019]
DeNA
 
cvsaisentan20141004 kanezaki
cvsaisentan20141004 kanezakicvsaisentan20141004 kanezaki
cvsaisentan20141004 kanezaki
kanejaki
 
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卒研進捗LT
mohemohe
 
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステムオープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
Shinya Takamaeda-Y
 
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen
直久 住川
 
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
Kenichi 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 switch
m 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
 
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステムオープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
 
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen2021 03-09-ac ri-nngen
2021 03-09-ac ri-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 WelcomeTalk
Masahiro 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のOverview
Masahiro 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 Future
Masahiro Hidaka
 
DroidKaigi 2018 WelcomeTalk
DroidKaigi 2018 WelcomeTalk DroidKaigi 2018 WelcomeTalk
DroidKaigi 2018 WelcomeTalk
Masahiro Hidaka
 
KotlinConf Recap
KotlinConf RecapKotlinConf Recap
KotlinConf Recap
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 Studio
Masahiro 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
 
Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
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