我有一台配备 32GB RAM 的 Mac 服务器(雪豹)。当我尝试在 Perl (v 5.10.0) 中分配超过 1.1GB 的 RAM 时,出现内存不足错误。这是我使用的脚本:
#!/usr/bin/env perl
# My snow leopard MAC server runs out of memory at >1.1 billion bytes. How
# can this be when I have 32 GB of memory installed? Allocating up to 4
# billion bytes works on a Dell Win7 12GB RAM machine.
# perl -v
# This is perl, v5.10.0 built for darwin-thread-multi-2level
# (with 2 registered patches, see perl -V for more detail)
use strict;
use warnings;
my $s;
print "Trying 1.1 GB...";
$s = "a" x 1100000000; # ok
print "OK\n\n";
print "Trying 1.2 GB...";
$s = '';
$s = "a" x 1200000000; # fails
print "..OK\n";
这是我得到的输出:
Trying 1.1 GB...OK
perl(96685) malloc: *** mmap(size=1200001024) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Out of memory!
Trying 1.2 GB...
任何想法为什么会发生这种情况?
2013 年 11 月 14 日下午 4:42 更新
根据 Kent Fredric(参见下面的 2 篇文章),这是我的 ulimit。虚拟内存默认为无限制
$ ulimit -a | grep 字节 数据段大小 (kbytes, -d) 无限制 最大锁定内存 (kbytes, -l) 无限制 最大内存大小 (kbytes, -m) 无限制 管道大小(512 字节,-p)1 堆栈大小(千字节,-s)8192 虚拟内存 (kbytes, -v) 无限制 $ perl -E '我的 $x = "a" x 1200000000; 打印“确定\n”' perl(23074) malloc: *** mmap(size=1200001024) 失败(错误代码=12) *** 错误:无法分配区域 *** 在 malloc_error_break 中设置断点进行调试 内存不足! $ perl -E '我的 $x = "a" x 1100000000; 打印“确定\n”' 行
我尝试将虚拟内存设置为 100 亿,但无济于事。
$ ulimit -v 10000000000 # 100亿 $ perl -E '我的 $x = "a" x 1200000000; 打印“确定\n”' perl(24275) malloc: *** mmap(size=1200001024) 失败(错误代码=12) *** 错误:无法分配区域 *** 在 malloc_error_break 中设置断点进行调试 内存不足!