我买了一个 vps 来托管我的 Java 需求。但我无法在其上运行 Java。有关 Java 的一切都已正确安装,但当我尝试运行 Java(例如“java -version”)时,我收到此错误:
VM 初始化期间发生错误,
无法为对象堆保留足够的空间,
无法创建 Java 虚拟机。
我不认为这是一个以 Java 为中心的问题,肯定是内存不足。我联系了 vps 管理员,但他说一切正常,您有 2GB 内存,可扩展到 4GB!我对这个主题做了一些搜索,这是我的 BEANS 文件(使用脚本将数字转换为可读格式)。顺便问一下,JVM 堆内存分配是否基于 kmemsize 或 privvmpages?该配置允许我为单个进程分配多少内存?
resource held maxheld barrier limit failcnt
kmemsize 2.25 mb 2.35 mb 13.71 mb 14.10 mb 0
lockedpages 0 0 1024.00 kb 1024.00 kb 0
privvmpages 20.54 mb 21.33 mb 256.00 mb 272.00 mb 156
shmpages 5.00 mb 5.00 mb 84.00 mb 84.00 mb 0
numproc 13 14 240 240 0
physpages 9.36 mb 9.45 mb 0 MAX_ULONG 0
vmguarpages 0 0 132.00 mb MAX_ULONG 0
oomguarpages 9.36 mb 9.45 mb MAX_ULONG MAX_ULONG 0
numtcpsock 3 3 360 360 0
numflock 3 3 188 206 0
numpty 2 2 16 16 0
numsiginfo 0 1 256 256 0
tcpsndbuf 69.17 kb 69.17 kb 1.64 mb 2.58 mb 0
tcprcvbuf 48.00 kb 48.00 kb 1.64 mb 2.58 mb 0
othersockbuf 6.80 kb 6.80 kb 1.07 mb 2.00 mb 0
dgramrcvbuf 0.00 kb 0.00 kb 256.00 kb 256.00 kb 0
numothersock 9 10 360 360 0
dcachesize 0.00 kb 0.00 kb 3.25 mb 3.46 mb 0
numfile 704 746 9312 9312 0
numiptent 10 10 128 128 0
提前致谢!
答案1
仔细检查你的脚本是否正确翻译了原始 beancounters。据此,你只有 256 MB 的 RAM,而不是管理员告诉你的 4 GB。
只关注 2 个豆子:
- privvmpages - 容器可以分配(保留)的最大内存量
- oomguarpages - 保证容器实际使用的内存量。如果主机内存紧张,则所有使用超过该数量的内存都可能被终止。
Java 因分配大量内存而臭名昭著,但从来不使用它们,而是指望操作系统过度承诺以我的经验来看,虽然只会用到几十兆,但至少需要 1GB 的权限页才能可靠地运行 JVM。
经过几个月的实验和尝试在运行 Java 的 VE 中包含特权页面后,我个人已经放弃了,我只是将障碍设置为最大值并适当调整 oomguarpages 并希望获得最好的效果 ;)
答案2
当我在 VPSLink 上托管时,我遇到了类似的问题,Sun/Oracle JVM 无法与 OpenVZ 一起使用(您可以在 VPSLink 论坛上搜索旧主题以获取更多信息)。
最后,在 OpenVZ 容器上对我有用的东西只有 IBM JDK,你可以在https://www.ibm.com/developerworks/java/jdk/linux/download.html
不过我认为更好的解决方案是转移到专用服务器,您可以在其中安装所需的 JDK,并且比使用 OpenVZ 时麻烦少得多。
答案3
你应该试试JRockit虚拟机它在我的 OpenVZ VPS 上运行完美,它消耗的内存比 Sun/Oracle jvm 少得多。