在我的 VPS(CentOS)4GB RAM(需要时动态分配 2 + 2)上,我使用以下选项 JAVA_OPTS="-Xms256m -Xmx2048m -XX:MaxPermSize=256m" 运行 tomcat。
现在,当我尝试启动其他基于 Java 的应用程序(例如 Hudson 服务器)时出现以下错误:
内存不足,无法让 Java 运行时环境继续运行。 本机内存分配(malloc)无法为 Chunk::new 分配 664080 字节 包含更多信息的错误报告文件保存为: /服务器/hs_err_pid26476.log
看起来好像系统无法分配 650KB 的内存,但应该有 1.2 GB 的可用内存。
免费-m 已使用的、可用的、缓存的共享缓冲区总数 内存:4096 2816 1279 0 0 0 -/+ 缓冲区/缓存:2816 1279 交换:0 0 0
我发现我还应该检查 /proc/user_beancounters,它显示 privvmpages 上有 failcnt。我不知道那是什么意思(提供商是否按要求提供了 4GB 内存?还是他在作弊?)
# 猫/proc/user_beancounters 版本:2.5 uid 资源持有 maxheld 屏障限制 failcnt 70692271:kmem大小15371949 15388993 41943040 46137344 0 锁定页面 0 0 1024 1024 0 特权页面 720030 720189 1048576 1048576 9604 shmpages 9001 9001 65536 65536 0 虚拟 0 0 9223372036854775807 9223372036854775807 0 数值处理 109 109 256 256 0 物理页面 173670 173780 9223372036854775807 9223372036854775807 0 vmguarpages 0 0 262144 262144 0 oomguarpages 174598 174708 9223372036854775807 262144 0 numtcpsock 30 30 1440 1440 0 numflock 14 14 752 826 0 numpty 1 1 64 64 0 numsiginfo 0 0 1024 1024 0 tcpsndbuf 601840 601840 6881280 10813440 0 tcprcvbuf 491520 491520 6881280 10813440 0 其他sockbuf 174600 174600 4504320 8388608 0 dgramrcvbuf 0 0 1048576 1153432 0 数字袜子 117 118 1440 1440 0 dcachesize 0 0 7340032 8074035 0 文件编号 3516 3516 16384 16384 0 虚拟 0 0 0 0 0 虚拟 0 0 0 0 0 虚拟 0 0 0 0 0 numiptent 18 18 400 405 0
答案1
OpenVZ 提供商通常以两个数字出售其虚拟机的 RAM 容量:“保证”和“突发”RAM。您应该始终获得“保证”数量的 RAM,并且如果主机资源允许,可以使用最多“突发”数量的 RAM。例如,VPS 可能以“512MiB 保证 1GiB 突发 RAM”的形式出售。
您应该始终能够成功分配低于“保证”量的内存,但是,如果主机上的其他虚拟机也在消耗 RAM,或者提供商对机器的订阅过多(几乎总是如此),则内存分配有时可能会在高于该量时失败。
要了解这些数字是什么,请查看barrier
为了vmguarpages
代表“保证”的 RAM,以及limit
为了privvmpages
表示“突发” RAM。每个数字都以 4KiB 页面数表示。
因此,就您而言,我们可以看到您拥有 1GiB(262144)“保证”RAM 和 4GiB(1048576)“突发”RAM。(如果这些不是您承诺的数字,您需要与您的 VPS 提供商进行一次非常不愉快的谈话。)
由于您在虚拟机中使用的内存已经远远超过 2GiB,因此您的内存分配可能会失败,因为它超过了“保证”的数量。
答案2
您的提供商很可能只保证 2 GB 内存,如果其他客户当前需要的内存较少(这种情况很少发生),则再保证 2 GB 内存。因此,您最好假设最大内存为 2 GB,而不是 4 GB。
privvmpages 上的失败计数显示系统分配内存失败的频率(粗略地说)。