如果我调用 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等)中不起作用。
这个问题有解决方案吗?
Java 在 Xen 中运行良好——我现在正在 Xen VM 上运行一个大型 Solr 实例。它也适用于 OpenVZ(去过那里,做过),尽管由于 OpenVZ 的“有趣”分配限制模型,它确实需要一些调整。基本上,无论你在读什么,它都是大错特错的。
要检查的内容包括:
/proc/sys/vm/overcommit_memory
设置为2 ?这将防止过度使用工作,这是 Java 试图做的核心。Java 当然适用于 Xen。可能是您没有足够的物理(+交换)内存来启动 JVM。Xen 域往往受到它们拥有的内存量的限制。128MB 或 256MB 对于商业 VPS 提供商来说相当普遍。JVM 使用两个参数来设置堆的初始大小和最大大小。它们分别是 -Xms 和 -Xmx。IIRC -Xmx 的默认值是(或至少是)64M。如果配置了 -Xms,JVM 将尝试在启动时分配那么多内存。将两个值设置为相同的值以停止内存碎片是一个常见的技巧。将 -Xms 设置为高于您实际可用的值可能会给您带来一些问题。我会尝试创建一个简单的 Hello World java 程序,看看你是否可以运行类似的东西:
看看这是否有效。如果不起作用,请尝试降低值;如果确实如此,请提高它。希望您能发现您可以使用多少内存。