コンパイル処理は大量のメモリーを使用することがあります。必要なメモリーのサイズは、選択した最適化レベル、およびコンパイルするファイルのサイズや複雑さに依存します。SPARC プラットフォームでは、最適化でメモリーが不足した場合、その時点の手続きを低いレベルで最適化し直し、後続のルーチンはコマンド行の -On オプションで指定されていた本来のレベルで最適化を再開します。
コンパイラを実行するプロセッサには最低 64M バイトのメモリーが実装されている必要があります。256M バイトが推奨メモリーです。また、十分なスワップ領域が割り当てられる必要もあります。最低 200M バイトで、300M バイトが推奨値です。
メモリーの使用量は、手続きのサイズ、最適化レベル、仮想メモリーの制限、ディスクのスワップファイルのサイズ、その他さまざまな要素によって異なります。
多数のルーチンを含む単一のソースファイルをコンパイルすると、メモリーやスワップ領域が不足することがあります。
コンパイラのメモリーが不足する場合は、最適化レベルを下げてください。または fsplit(1) を使用して、複数のルーチンが含まれているソースファイルを、1 ルーチンが 1 ファイルに対応するようにいくつかのファイルに分割してください。
SunOSTM オペレーティングシステムのコマンドである swap -s コマンドは、利用可能なスワップ領域を表示します。swap(1M) を参照してください。
例: swap コマンドを使用します。
demo% swap -s total: 40236k bytes allocated + 7280k reserved = 47516k used, 1058708k available To determine the actual real memory: |
demo% /usr/sbin/dmesg | grep mem mem = 655360K (0x28000000) avail mem = 602476544 |
ワークステーションのスワップ領域を増やすには、mkfile(1M) と swap(1M) コマンドを使用します。この操作は、スーパーユーザーだけが実行できます。mkfile によって特定サイズのファイルを作成し、swap -a によってそのファイルをシステムのスワップ領域に追加します。
demo# mkfile -v 90m /home/swapfile /home/swapfile 94317840 bytes demo# /usr/sbin/swap -a /home/swapfile |
最適化レベル -O3 以上のレベルで大規模なルーチン (1 つの手続きが数千行ものコードで構成されるルーチン) をコンパイルすると、メモリーがさらに必要になる場合があり、コンパイル時間のパフォーマンスが低下することもあります。これを制御するには、1 つのプロセスで使用できる仮想メモリーの量を制限します。
sh シェルでは、ulimit コマンドを使用します。sh(1) を参照してください。
demo$ ulimit -d 16000 |
csh シェルでは、limit コマンドを使用します。csh(1) を参照してください。
例: 仮想メモリーを 16M バイトに制限します。
demo% limit datasize 16M |
いずれの場合も、オプティマイザは 16M バイトのデータ領域で最適化を再実行します。
この制限はマシンで利用可能なスワップ領域の総量を超えることはできないので、実際は、大規模なコンパイルの進行中であってもマシンを普通に使用できる程度の小さい値を指定してください。コンパイル処理でスワップ領域の半分以上が使用されることのないように注意してください。
例: 32M バイトのスワップ領域のあるマシンでは、次のコマンドを使用します。
sh シェルの場合:
demo$ ulimit -d 1600 |
csh の場合
demo% limit datasize 16M |
最適な設定は、最適化のレベルや、利用可能な実メモリーと仮想メモリーの量によって異なります。
64 ビットの Solaris 環境では、アプリケーションデータセグメントのサイズに対する弱い制限値は 2G バイトです。データ領域の追加割り当てが必要な場合は、シェルの limit または ulimit コマンドを使用して制限を解除します。
csh の場合:
demo% limit datasize unlimited |
sh、ksh の場合:
demo$ ulimit -d unlimited |
詳細は、『Solaris 64 ビット開発ガイド』を参照してください。