我使用的是 Ubuntu 11.10,由 OpenVZ 虚拟化。该输出free -m
表明缓冲区始终等于已使用。
total used free shared buffers cached
Mem: 2048 1079 968 0 0 0
-/+ buffers/cache: 1079 968
Swap: 0 0 0
这就是我无法运行 java 虚拟机的原因吗,尽管有 968mb 的可用内存?
答案1
这是由于 OpenVZ。您可以看到 中应用的限制/proc/user_beancounters
,并且这里有一些解释:http://wiki.openvz.org/Privvmpages
虽然我在容器中没有遇到过内存问题,但我认为这里的建议是:
http://www.moeding.net/archives/20-Optimizing-virtual-memory-in-OpenVZ-I.html
从设置堆栈大小开始ulimit
是一个不错的选择。请注意,OpenVZ 使用与您在顶部 VIRT 列中找到的相同指标的暗示是错误的;我相信“privvmpages”是标记的虚拟页面可写且私有,因此明显小于进程的整个地址空间。其中还有一些其他错误信息(“不幸的是,内存不足是大多数程序无法正确处理的错误情况。”——在 Linux 上,内存不足是默认情况不是错误情况,因此程序没有机会正确处理它)。但是降低堆栈大小可能仍然值得尝试。
Slm 的建议似乎是寻找肥猫的一个很好的解决方案,但如果你的切片和我的一样,那就没有/proc/bc
办法了。但是,您可以通过 获取进程的可写和私有统计信息pmap -d
,或者查看顶部的数字。
1 gig 似乎足以运行 JVM,但有一个复杂的情况:因为已使用和可用的内存量不是一个简单的数字(请参阅一些关于原因的讨论)这里),总数可能超过机器在给定时间点实际可以提供的数量。
答案2
我用 bash 函数这样做。
vzr_mb ()
{
( printf "vm feature held(MB) maxheld(MB) barrier(MB) limit(MB) failcnt\n";
grep privvm /proc/bc/1*/resources | awk '{sub($3,$3*4096/2^20) sub($4,$4*4096/2^20) sub($5,$5*4096/2^20) sub($6,$6*4096/2^20)}1' ) | column -t
}
运行它看起来像这样:
% vzr_mb
vm feature held(MB) maxheld(MB) barrier(MB) limit(MB) failcnt
/proc/bc/101/resources: privvmpages 184.422 300.129 300 310 2
/proc/bc/102/resources: privvmpages 473.703 861.078 900 950 13
/proc/bc/103/resources: privvmpages 184.457 579.941 300 350 238
/proc/bc/104/resources: privvmpages 307.961 700.473 400 450 70
/proc/bc/105/resources: privvmpages 477.828 773.586 700 750 1730347
/proc/bc/106/resources: privvmpages 637.801 981.281 1000 1050 511
/proc/bc/108/resources: privvmpages 167.777 580.102 285 295 1
/proc/bc/109/resources: privvmpages 202.055 308.969 395 425 0
/proc/bc/110/resources: privvmpages 212.492 625.324 295 325 326
/proc/bc/111/resources: privvmpages 189.539 535.492 295 325 5
/proc/bc/112/resources: privvmpages 239.617 407.766 468.75 488.281 0
/proc/bc/180/resources: privvmpages 195.605 601.602 200 225 3049321
/proc/bc/181/resources: privvmpages 967.027 1304.82 1500 2000 3
/proc/bc/183/resources: privvmpages 0 1087.72 1115 1150 0