Java“无法为对象堆保留足够的空间”,但有大量可用RAM

Java“无法为对象堆保留足够的空间”,但有大量可用RAM

我在服务器上运行 Java 应用程序时遇到问题。

root@dobby [/opt]# jdk1.7.0_09/jre/bin/java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

...但可用 RAM 约为 4GB(其中 3GB 由 Linux 缓存使用)。如果我Xmx在命令中添加:

root@dobby [/opt]# jdk1.7.0_09/jre/bin/java -Xmx100m -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:
# /opt/hs_err_pid32241.log

这是怎么回事?

细节:

  • 64 位系统
  • Linux 2.6.32
  • CentOS 6.2
  • Oracle JDK 1.7.0 update 9(早期版本也出现过此问题)

Java错误报告:http://pastebin.com/uaxdSyh3

限制:

root@dobby [/home/bart]# ulimit -a -S
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62763
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 1048576
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) 1048576
file locks                      (-x) unlimited


root@dobby [/home/bart]# ulimit -a H
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62763
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 1048576
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) 1048576
file locks                      (-x) unlimited

答案1

简单的答案可能是你的 limits.conf 有问题。你可以发布输出

ulimit -a -S
ulimit -a -H 

好的,我继续检查了这一点。问题出在“-v”设置上,与虚拟内存设置有关,而不是“-m”设置。这是在 Fedora 17 机器上,但这应该很重要:

$ ulimit -S -v
unlimited
$ java -version
java version "1.7.0_09-icedtea"
OpenJDK Runtime Environment (fedora-2.3.3.fc17.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

$ ulimit -v 1048576
$ java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

去修复!;)

相关内容