编译需要的内存量取决于多个参数,包括:
每个过程的大小
优化级别
为虚拟内存设置的限制
磁盘交换文件的大小
在 SPARC 平台上,如果优化器用完了所有内存,那么它将通过在较低优化级别上重试当前过程来尝试恢复。然后优化器将以在命令行上通过 -xOlevel 选项指定的原始级别恢复后续例程。
如果编译包括大量例程的单独源文件,编译器可能会用完所有内存或交换空间。可以尝试降低优化级别。或者,将最大的过程分为其自身的单独文件。
swap -s 命令用于显示可用的交换空间。有关更多信息,请参见 swap(1M) 手册页。
以下示例演示了 swap 命令的用法:
example% swap -s total: 40236k bytes allocated + 7280k reserved = 47516k used, 1058708k available
使用 mkfile(1M) 和 swap(1M) 可增加工作站上交换空间的大小。(您必须成为超级用户才能执行该操作)。mkfile 用于命令创建特定大小的文件,而 swap -a 用于将文件增加到系统交换空间:
example# mkfile -v 90m /home/swapfile /home/swapfile 94317840 bytes example# /usr/sbin/swap -a /home/swapfile
在 -xO3 或更高级别编译非常大型的例程(一个过程中有数几千行代码)需要大量内存。在这种情况下,系统性能可能降低。您可以通过限制单个进程的可用虚拟内存量来控制内存占用。
要在 sh shell 中限制虚拟内存,请使用 ulimit 命令。有关更多信息,请参见 sh(1) 手册页。
以下示例显示了如何将虚拟内存限制为 4GB:
example$ ulimit -d 4000000
在 csh shell 中,可使用 limit 命令限制虚拟内存。有关更多信息,请参见 csh(1) 手册页。
下一个示例也显示了如何将虚拟内存限制为 4GB:
example% limit datasize 4G
这些示例都会使优化器在数据空间达到 4GB 时尝试恢复。
虚拟空间的限制不能大于系统总的可用交换空间。在实际使用时,虚拟空间的限制要足够的小,以允许在大型编译过程中正常使用系统。
请确保编译不会消耗一半以上的交换空间。
有 8GB 的交换空间时,请使用以下命令:
在 sh shell 中:
example$ ulimit -d 4000000
在 csh shell 中:
example% limit datasize 4G
最佳设置取决于要求的优化程度、实际内存量和可用的虚拟内存量。