Linux:如何检查进程可用的最大连续地址范围

我想在命令行中inputpid,并取回未被保留的最大的连续地址空间。 有任何想法吗?

我们的32位应用程序运行在64位RHEL 5.4上,运行了一段时间,比如说24小时。 那个时候内存使用量只有2.5GB,但是内存出错了。 我们认为它无法映射大型文件,因为应用程序的内存空间是分散的。 我想出去到生产服务器,只是testing这个理论。

    我上面评论的更好的版本:

     #!perl -T use warnings; use strict; scalar(@ARGV) > 0 or die "Use: $0 <pid>"; my $pid = $ARGV[0]; $pid = oct($pid) if $pid=~/^0/; # support hex and octal PIDs $pid += 0; $pid = abs(int($pid)); # make sure we have a number open(my $maps, "<", "/proc/".$pid."/maps") or die "can't open maps file for pid ".$pid; my $max = 0; my $end = 0; while (<$maps>) { /([0-9a-f]+)-([0-9a-f]+)/; $max = hex ($1) - $end if $max < hex ($1) - $end; $end = hex ($2); } close ($maps); END { print "$max\n"; } 

    可能不是你想要的,但是从一个进程里面,可以通过mmap ing进行二进制搜索而不用分配。 即mmap(4GB) ,如果mmap(2GB)失败, mmap(3GB )成功,依此类推。

    我们得到了内存不足的错误。 我们认为它无法映射大型文件,因为应用程序的内存空间是分散的。

    但是,在纸上仍然有大量免费的虚拟地址范围的情况下,也可以得到OOM错误,例如缺少RAM +交换。 此外,您的系统和/或程序可能已关闭(sysctl -a),或禁止交换(mlock(2)),或者实际上对映射的限制非常钝(ulimit -v) – 后者在一些分布设置这样或那样的限制的情况下很容易运行。