メモリー・フットプリント
メモリー・フットプリント(英語: memory footprint)は、プログラムが実行中に使用または参照するメインメモリの合計量を意味する[1]。
フットプリント (footprint) という単語は、一般には、物体が専有する物理的な次元の範囲、つまり、物体の大きさを意味する。コンピュータ科学の分野では、ソフトウェア・アプリケーションのメモリー・フットプリントとは、プログラムの実行中に必要なメモリの量を意味する。このメモリの中には、(大部分の)プログラムの命令(や一部の定数)が格納されているコードセグメント(英語版)、(初期化または未初期化状態の)データセグメント(英語版)、ヒープメモリ、コールスタック、その他に必要な追加のデータ構造であるシンボルテーブル、デバッグ用データ構造、オープンしたファイル、現在のプロセスにマップされた共有ライブラリなど、プログラムが実行中や実行後に少なくとも1回読み込まれる可能性のある、あらゆるアクティブなメモリ領域が含まれる[2]。
大きなプログラムは大きなフットプリントを持つ。アプリケーションのメモリフットプリントは、大まかに言って、読み込む共有ライブラリやクラスの数やサイズに比例し、一方、静的なライブラリや静的なデータ領域は、固定サイズ(定数)のフットプリントを増加させる。通常、メモリー・フットプリントの大部分を占めるのは、プログラム本体のサイズではなく、むしろ、ランタイム環境によって追加される構造である。たとえば、C++コンパイラは、プログラムの実行中にアクティブな、vtables、型情報のオブジェクト、多数の一時的で匿名のオブジェクトなどを追加する。Javaのプログラムでは、メモリー・フットプリントの大部分は、Javaアプリケーション実行時に間接的に読み込まれる、Java Virtual Machine (JVM) の形で実行環境を構築するために消費される。さらに、ほとんどのオペレーティングシステムでは、アプリケーションがオープンしたディスクファイルもアプリケーションのアドレス空間に読み込まれるため、フットプリントが増加する。
メモリ使用方法の変遷
1990年代に、コンピュータのメモリが安価になったため、大きなメモリフットプリントのプログラムは一般的なものになった。この傾向は大量のメモリを消費する商用のアプリケーション(たとえばデータベース)や、メモリインテンシブなマルチメディアのオーサリング・編集ソフトウェアなどのコンピュータソフトウェアの普及による。増加し続けるメモリ必要量の問題に対処するために開発されたのが、仮想メモリのシステムである。これは、利用可能なメモリを均等なサイズに分割し、ハードディスク上に「ページ」という単位でメモリーを保存し、アクセスが必要になったタイミングで、必要に応じて読み込むという手法である。
巨大なメモリフットプリントのプログラムをサポートするこのアプローチは大成功したため、Microsoft Windows、AppleのmacOS、全バージョンのLinuxおよびUnixなど、現在のほぼすべてのオペレーティングシステムは、仮想メモリシステムの機能を提供している。
組込みシステム
メモリー使用量に制約のある組込みシステムでは、伝統的にメモリー・フットプリントの小さいプログラムが重要であった。そのため、組込みシステムの開発者たちは、通常、効率性(処理速度)を犠牲にしてでも、利用できるRAMに収まるようにプログラムのフットプリントを小さくする努力をしてきた。たとえば、サン・マイクロシステムズはそのようなメモリ制約のあるデバイス用のJava仮想マシン (JVM) である、K virtual machine(英語版)を提供している。通常の家庭用PCやスマートデバイスでは、メガバイトからギガバイトのメモリが利用できるが、KVMはキロバイトレベルのメモリしかないプラットフォームでも動作するようになっている。