Solaris のアプリケーションは、malloc()、brk()、mmap() などの関数を使用してメモリーを割り当てます。アプリケーションで割り当てることのできるメモリーの最大量は、ユーザー仮想アドレス空間のサイズによって制限されます。ユーザー仮想アドレス空間に含まれているプログラムのテキスト、スタック、データ、ライブラリなどによって、メモリー割り当ての最大サイズがさらに減少することもあります。
32 ビットコンピューティング環境では、ユーザーとカーネルの間で 32 ビット仮想アドレス空間が共有されます。したがって、ユーザー仮想アドレス空間のサイズは、4G バイトからカーネル仮想アドレス空間のサイズを引いたものとなります。カーネル仮想アドレス空間のサイズは、物理メモリーのサイズに応じて決まります。物理メモリーのサイズが大きくなるほど、ユーザー仮想アドレス空間のサイズは小さくなります。8G バイトのメモリーを備えたシステムの場合、ユーザー仮想アドレス空間のサイズは約 3G バイトです。
メモリー割り当て制限のためアプリケーションに十分なメモリーが得られない場合は、次の 2 つの方法があります。
カーネル仮想アドレス空間のデフォルトのサイズを減らして、ユーザー仮想アドレス空間のサイズを増やします。eeprom コマンドを使用して、kernelbase 変数をより高い値に設定できます。kernelbase の変更は慎重に行なってください。システムのカーネル仮想アドレス空間を小さくすると、システムがハングアップしたり、動作効率が低下したりすることがあります。
より良い方法としては、Solaris x86 64 ビットコンピューティング環境でアプリケーションを実行します。
64 ビットコンピューティング環境では、32 ビットアプリケーション用の仮想アドレス空間はすべてユーザー用となります。したがって、32 ビットアプリケーションでは、4G バイトからテキスト、スタック、およびライブラリに必要なユーザーアドレス空間を引いた残りすべてを割り当てることができます。
初期の 64 ビット AMD プロセッサの一部では、メモリー割り当て上限がさらに 1G バイト少なくなる場合があります。使用しているプロセッサがこの影響を受けるかどうかを調べるには、次の手順を実行します。
任意の 32 ビットシェルから、コマンド pmap $$ を実行します。
プロセスマップで、0xC0000000 以上のアドレスが表示されるかどうかを確認します。このようなアドレスが存在しない場合は、Solaris OS によって 32 ビットアプリケーションが制限され、4G バイトの仮想アドレス空間のうち下位の 3G バイトになっています。
64 ビットアプリケーションは、すでに使用中のメモリーに応じて 250T バイトまで割り当てることができます。