Java(SUN JRE / JDK)不会在Xen实例上启动

如果我调用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等)中不起作用。

有这个问题的解决scheme吗?

Java在Xen中工作正常 – 我正在Xen VM上运行一个大的Solr实例。 它也适用于OpenVZ(在那里,做到了这一点),但由于OpenVZ的“有趣的”分配限制模型,它确实需要一些调整。 基本上,无论你在读什么,这是大规模和完全错误的。

需要检查的事项包括:

  • 你有任何交换configuration? 你可能需要其中的一些,而且在paravirt虚拟机中意外地没有交换是很容易的。
  • /proc/sys/vm/overcommit_memory设置为2? 这将防止过度使用,这是Java试图做的核心。
  • 虚拟机的configuration是否低于您要Java分配的configuration? 如果它正在运行一堆其他东西,并且内存不足,那么如果你告诉它使用一堆怪物,Java仍然可以炸弹。

Java当然在Xen上工作。 可能是因为没有足够的物理(+交换)内存来启动JVM。 Xen域往往受到它们拥有的内存数量的限制。 对于商业VPS提供商来说,128MB或256MB是相当普遍的。 JVM使用两个参数来设置堆的初始大小和最大大小。 这些分别是-Xms和-Xmx。 IIRC默认的-Xmx是(或者至less是)64M。 如果configuration了-Xms,则JVM将在启动时尝试分配那么多的内存。 将这两个值设置为相同的值来停止内存碎片是常见的技巧。 将-Xms设置为高于你物理上可用的值可能会导致你一些问题。 我会尝试创build一个简单的Hello World Java程序,看看你是否可以像这样运行:

 # java -Xms=32M -Xmx=32M HelloWorld 

看看是否有效。 尝试减less值,如果它不工作; 如果是的话就提高。 希望你能发现你可以使用多less内存。