如果我调用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的“有趣的”分配限制模型,它确实需要一些调整。 基本上,无论你在读什么,这是大规模和完全错误的。
需要检查的事项包括:
/proc/sys/vm/overcommit_memory设置为2? 这将防止过度使用,这是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内存。