gis*_*sit 2 linux vps java virtual-memory
在我的 VPS (CentOS) 4GB ram(2 + 2 需要时动态分配)上,我让 tomcat 运行以下选项 JAVA_OPTS="-Xms256m -Xmx2048m -XX:MaxPermSize=256m"。
现在,当我尝试启动其他基于 Java 的应用程序(如 hudson 服务器)时,出现以下错误:
没有足够的内存供 Java 运行时环境继续使用。 本机内存分配 (malloc) 未能为 Chunk::new 分配 664080 字节 包含更多信息的错误报告文件保存为: /server/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 内存?还是他在作弊?)
# cat /proc/user_beancounters 版本:2.5 uid 资源持有 maxheld 屏障限制 failcnt 70692271:kmemsize 15371949 15388993 41943040 46137344 0 锁定页面 0 0 1024 1024 0 privvmpages 720030 720189 1048576 1048576 9604 页面 9001 9001 65536 65536 0 假人 0 0 9223372036854775807 9223372036854775807 0 numproc 109 109 256 256 0 physpages 173670 173780 92233720368547775807 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 数量 1 1 64 64 0 数字信息 0 0 1024 1024 0 tcpsndbuf 601840 601840 6881280 10813440 0 tcprcvbuf 491520 491520 6881280 10813440 0 其他缓冲缓冲 174600 174600 4504320 8388608 0 dgramrcvbuf 0 0 1048576 1153432 0 numothersock 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 数字 18 18 400 405 0
OpenVZ 提供商通常将其虚拟机的 RAM 容量出售为两个数字:“保证”和“突发”RAM。您应该始终获得“保证”数量的 RAM,并且如果主机资源允许,最多可以使用“突发”数量。例如,VPS 可能会以“512MiB 保证 1GiB 突发 RAM”的形式出售。
您应该始终拥有低于“保证”数量的成功内存分配,但如果主机上的其他虚拟机也在消耗 RAM,或者如果提供程序已超额订阅该机器(几乎总是),则内存分配有时可能会失败,高于该数量.
要了解这些数字,看看barrier
为vmguarpages
代表的“保证” RAM,以及limit
为privvmpages
代表的“爆” RAM。这些数字中的每一个都以 4KiB 页面的数量表示。
因此,在您的情况下,我们可以看到您有 1GiB (262144)“保证”RAM 和 4GiB (1048576)“突发”RAM。(如果这些不是您承诺的数字,您需要与您的 VPS 提供商进行一次非常不愉快的谈话。)
由于您在 VM 中使用的内存已经超过 2GiB,您的内存分配可能会失败,因为它高于“保证”数量。