【问题标题】:Couldn't reserve enough space for object heap无法为对象堆保留足够的空间
【发布时间】:2014-02-28 18:14:24
【问题描述】:

我在使用 java 时遇到了一个奇怪的内存限制。下面我用不同的堆大小执行“java -version”。一旦我将堆设置为超过 30M,java 就会出错退出,抱怨没有可用内存。

# /usr/java/default/bin/java -Xmx30m -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

# /usr/java/default/bin/java -Xmx40m -version
#
# There is insufficient memory for the Java Runtime Environment to continue.
# pthread_getattr_np
# An error report file with more information is saved as:
# /root/hs_err_pid6689.log

# /usr/java/default/bin/java -Xmx50m -version
Error occurred during initialization of VM
java.lang.OutOfMemoryError: unable to create new native thread

# /usr/java/default/bin/java -Xmx60m -version
#
# There is insufficient memory for the Java Runtime Environment to continue.
# pthread_getattr_np
# An error report file with more information is saved as:
# /root/hs_err_pid6703.log

根据“免费”,我有很多空闲 RAM:

# free -m
             total       used       free     shared    buffers     cached
Mem:          2909       1051       1858          0         17        618
-/+ buffers/cache:        415       2494
Swap:          511          0        511

但据我所知,这是一个内存限制问题。当我杀死一些后台进程时,我可以为“java -version”命令分配更多的堆。

有人知道发生了什么吗?

【问题讨论】:

  • 你用的是什么硬件?
  • 这是一个虚拟机 (kvm)。 x86_64 cpu(由于 32 位系统的 4G 内存限制,我在互联网上看到了很多类似的问题,所以我仔细检查了我在 64 位机器上)。 java 包也是为 x86_64 构建的(它是从 Oracle 网站下载的 jdk rpm)。我也检查了更新的 java 版本,结果相同。

标签: java memory-limit


【解决方案1】:

我正在回答我自己的问题(以防万一有人遇到类似问题)。

在我的系统上,我在 /etc/sysctl.conf 中有这个

vm.overcommit_memory = 2

将其设置回默认值 (0) 已解决问题:

vm.overcommit_memory = 0

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2013-11-04
    • 2023-03-18
    • 2020-11-26
    • 2015-07-14
    相关资源
    最近更新 更多