Javaアプリケーションを開発・運用するにあたり、OSのメモリ管理の概要を知っておく必要があります。本節では、OSの一般的なメモリ管理技法の1つである仮想アドレス空間を説明します。
なお、仮想アドレス空間の具体的なアーキテクチャはOSごとに異なりますが、本節では各OSに共通する内容を説明します。
■仮想メモリ
OSは、物理メモリ(RAM)だけでなくスワップファイルを活用することにより、多くのメモリ領域を使用することができます。このテクノロジーを仮想メモリといいます。仮想メモリの容量は、RAMとスワップファイルのサイズの合計になります。
図1 OSが利用可能なメモリ容量
ただし、ハードディスクへのアクセスはRAMより低速なので、メモリのスワッピングは性能に大きく影響を与えますので、注意が必要になります。
■仮想アドレス空間
OS上でプログラムを起動すると、OSがプログラムを実行・管理する単位としてのプロセスが生成されます。同様にして、Javaアプリケーションを起動すると、Javaプロセスが生成されます。
OS上で生成されたプロセスには、仮想アドレス空間が割り当てられます。仮想アドレス空間は、それぞれのプロセスで独立したものであり、あるプロセスから別のプロセスの仮想アドレス空間にアクセスすることはできません。マシンに積んでいる物理メモリ(RAM)のサイズとは関係なく、仮想アドレス空間のサイズは、常に一定です。たとえば、32ビットアーキテクチャのOSの場合、物理メモリ(RAM)のサイズに依存せず、仮想アドレス空間のサイズは常に4GB(2の32乗バイト)です。
このため、大量の仮想メモリを用意しても、1つのプロセスで使用できるメモリ量の上限は仮想アドレス空間の上限になりますから、プロセスが仮想アドレス空間の大きさを越えるメモリ量を必要とする場合は、メモリ不足の状態になります。
また、大量の仮想メモリを用意しても、OS上で大量のプロセスが動作していて仮想メモリを大量に消費している状態であれば、各プロセスに割り当てられた仮想アドレス空間を使い切っていなくても、メモリ不足の状態になる場合があります。
■ユーザ空間
プロセスが持つ仮想アドレス空間のうち、実際にプロセスが使用できる空間を、ユーザ空間といいます。ユーザ空間には、プログラムの実体(Windows(R)でJavaアプリケーションを実行する場合は、java.exeなど)がコピーされるだけでなく、スタックやヒープなどのさまざまなセグメントがあります。更にユーザ空間は、実行するプログラムだけでなく、そのプログラムを実行させるためのOS側のプログラムなどでも使用します。Javaプロセスのユーザ空間の場合には、前述の各セグメントの他に、Javaオブジェクトを格納するセグメント(=Javaヒープ)があります。このため、Javaアプリケーションをチューニングする際の対象となるJavaヒープのサイズの上限値は、ユーザ空間のサイズよりも少なくなります。
Javaアプリケーションのチューニングを実施する際は、仮想メモリの容量やプロセスの使用状況など、システムの状態を考慮する必要があります。なおOSの種類によって、ユーザ空間として使用できる上限値が異なるため、注意が必要です。