编译可能需要使用大量内存。这取决于选定的优化级别以及所编译文件的大小和复杂性。在 SPARC 平台上,如果优化器内存不足,它将尝试通过在较低的优化级别上重试当前过程来进行恢复,并以命令行上 -On 选项指定的原始级别继续执行后续例程。
运行编译器的处理器应该至少具有 64 兆字节内存;建议使用 256 兆字节内存。此外还应该分配足够的交换空间。最低为 200 MB;建议为 300 MB。
内存使用情况取决于每个过程的大小、优化级别、为虚拟内存设置的限制、磁盘交换文件的大小以及各种其他参数。
在编译包含多个例程的单个源文件时,可能会出现编译器内存或交换空间不足的情况。
如果编译器内存不足,请尝试降低优化级别,或者使用 fsplit(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 或更高的优化级别编译非常大的例程时,可能需要额外的内存,这可能会降低编译时性能。您可以通过限制单个进程的可用虚拟内存量来控制这种情况。
在 sh shell 中,请使用 ulimit 命令。请参见 sh(1)。
demo$ ulimit -d 16000 |
在 csh shell 中,请使用 limit 命令。请参见 csh(1)。
示例:将虚拟内存限定在 16 MB 以内:
demo% limit datasize 16M |
这些命令行的每一个命令行都会使优化器在数据空间达到 16 MB 时尝试恢复。
此限制值不能大于系统的总可用交换空间,实际上,在进行较大的编译时,此限制值必须足够小才能保证正常地使用系统。请确保没有任何编译占用一半以上的空间。
示例:对于 32M 的交换空间,请使用以下命令:
在 sh shell 中:
demo$ ulimit -d 1600 |
在 csh shell 中:
demo% limit datasize 16M |
最佳设置取决于所请求的优化等级以及可用的实际内存量和虚拟内存量。
在 64 位 Solaris 环境中,应用程序数据段大小的软限制为 2 GB。如果应用程序需要分配更多的空间,请使用 shell 的 limit 或 ulimit 命令取消该限制。
对于 csh,请使用:
demo% limit datasize unlimited |
对于 sh 或 ksh,请使用:
demo$ ulimit -d unlimited |
有关更多信息,请参见《Solaris(64 位)开发者指南》。