如果我调用 java 或 javac,则会发生以下错误:
Error occurred during initialization of VM
Could not reserve enough space for object heap
#
# An unexpected error has been detected by Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xb7dee4da, pid=9915, tid=3084225424
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b22 mixed mode linux-x86)
# Problematic frame:
# C [libc.so.6+0x6f4da] cfree+0x7a
#
# An error report file with more information is saved as:
# /root/hs_err_pid9915.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
Aborted
据我所知,问题应该是 java 试图分配一块连续的内存,但在某些虚拟环境(Xen、openVZ 和其他)中不起作用。
这个问题有解决办法吗?
答案1
Java 在 Xen 中运行良好——我现在正在 Xen VM 上运行一个大型 Solr 实例。它也可以在 OpenVZ 上运行(我曾经这样做过),尽管由于 OpenVZ 的“有趣”分配限制模型,它确实需要进行一些调整。基本上,无论您读到的是什么,它都是完全错误的。
要检查的内容包括:
- 您是否配置了交换?您可能需要一些交换,而且在 paravirt VM 中很容易意外地没有交换。
- 设置
/proc/sys/vm/overcommit_memory
为 2?这将阻止过度提交起作用,而这正是 Java 试图做到的核心。 - VM 是否只是配置不足,无法满足您要求 Java 分配的内存?如果它正在运行一堆其他东西,并且内存不足,即使您要求它使用大量堆,Java 仍然会崩溃。
答案2
Java 肯定可以在 Xen 上运行。可能是您没有足够的物理(+交换)内存来启动 JVM。Xen 域往往受到其内存量的限制。对于商业 VPS 提供商来说,128MB 或 256MB 是相当常见的。JVM 使用两个参数来设置堆的初始大小和最大大小。它们分别是 -Xms 和 -Xmx。如果我没记错的话,-Xmx 的默认值是(或至少曾经是)64M。如果配置了 -Xms,JVM 将在启动时尝试分配那么多内存。将两个值设置为相同的值以停止内存碎片是一种常见的技巧。将 -Xms 设置为高于您物理上可用的值可能会导致一些问题。我会尝试创建一个简单的 Hello World java 程序,看看您是否可以运行类似以下内容:
# java -Xms=32M -Xmx=32M HelloWorld
看看是否有效。如果无效,请尝试降低值;如果有效,请提高值。希望您能发现可以使用多少内存。