ネイティブ コードを記述していて、メモリ使用量が気になる場合は、アプリのネイティブ割り当てをプロファイリングして、最適化の余地があるかどうかを確認することをおすすめします。
アプリのメモリをプロファイリングする理由
Android は管理メモリ環境を備えています。アプリが一部のオブジェクトを使用していないことが検出されると、ガベージ コレクターは未使用のメモリをリリースしてヒープに戻します。Android が未使用のメモリを検出する仕組みは継続的に改善されていますが、すべての Android バージョンにおいて、ある時点でコードの実行を短時間一時停止する必要があります。ほとんどの場合、そういった一時停止は検出できません。システムがメモリを収集できる以上の速度でアプリがメモリを割り当てると、コレクターが十分なメモリを解放して割り当てを満たしていても、アプリで遅延が発生する場合があります。この遅延により、アプリがフレームをスキップしたり、明らかに速度が低下したりする場合があります。
アプリのメモリ使用量を削減できるプログラミング方法については、アプリのメモリを管理するをご覧ください。
ネイティブ アロケーションの概要
[メモリ使用量をトラッキング(ネイティブ割り当て)] タスクを実行すると、Android Studio Profiler は、指定した期間のネイティブ コード内のオブジェクトの割り当てと割り当て解除を追跡し、次の情報を提供します。
- Allocations: 選択した期間中に
malloc()
またはnew
演算子を使用して割り当てられたオブジェクトの数。 - Deallocations: 選択した期間中に
free()
またはdelete
演算子を使用して割り当て解除されたオブジェクトの数。 - Allocations Size: 選択した期間中のすべての割り当ての合計サイズ(バイト単位)。
- Deallocations Size: 選択した期間中のすべての解放されたメモリの合計サイズ(バイト単位)。
- 合計数: [Allocations] 列の値から [Deallocations] 列の値を引いた値。
- Remaining Size: [Allocations Size] 列の値から [Deallocations Size] 列の値を引いた値。
[ビジュアリゼーション] タブには、選択した期間の呼び出しスタック内のネイティブ コードに関連するすべてのオブジェクトの集計ビューが表示されます。基本的に、表示されているインスタンスを含むコールスタックが占有するメモリの合計量を示します。最初の行にはスレッド名が表示されています。デフォルトでは、オブジェクトは割り当てサイズに基づいて左から右に積み重ねられます。ドロップダウンを使用して順序を変更できます。
デフォルトでは、プロファイラは 2, 048 バイトのサンプルサイズを使用します。2, 048 バイトのメモリが割り当てられるたびに、メモリのスナップショットが作成されます。サンプルサイズが小さいほどスナップショットの頻度は高くなり、メモリ使用量に関してより正確なデータが得られます。サンプルサイズが大きいほどデータの精度は低くなりますが、システム リソースの消費量を削減し、記録時のパフォーマンスが改善されます。サンプルサイズを変更するには、録音構成を編集するをご覧ください。