[Android] 大量のヒープを確保する

Androidアプリ開発をしていると、1つのプロセスで多くのメモリを必要となるケースがあるかと思います。ここでは、より大きいヒープを確保する方法について説明します。
広 告
目次
前提条件
- なし
動作確認端末
- Google Nexus 5 – 5.0.0 – API21(エミュレータ)
1. ヒープとは
Androidでは、プロセス毎に「ヒープ」というメモリ領域をが確保されます。ヒープは、実際にプログラムが実行される時、画像データを確保したり、変数をしたり、必要なサイズを確保し、作業できるメモリ領域になります。アプリがメモリを大量に使用した時、メモリ量がヒープのサイズを超え、Out Of Memory
が発生します。
2. ヒープを確保する方法
Androidでは通常のアプリより大きいヒープを確保する方法があります。方法は非常にシンプルで、AndroidManifest.xml
内の<application>
タグにlargeHeap="true"
を記載するだけです。
以下が実装例になります。
largeHeap属性の使い方
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" … > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:theme="@style/AppTheme" > … </application> </manifest>
このlargeHeapの設定は、最初から大きなヒープを確保しているわけでなく、ヒープが圧迫された場合に、新しいヒープを確保する挙動をとります。その際、以下のデバッグログが出力されLogcatで確認することができます。
ヒープを確保された時のログ内容
Grow heap (frag case) to XX.MB for XXXXXXX-byte allocation
3. 注意点
一般的にメモリを大量に消費するアプリは、システム全体にリソースを圧迫することになるため、好ましくありません。この設定は、画像ビュアーアプリなどの大量にヒープを使うアプリを実装する場合にのみ、最終手段として使用するべきです。