64位Linux系统上无法保留9GB堆空间

4

看起来我在Linux服务器上为我的Java虚拟机分配内存时遇到了问题。

我正在使用以下命令进行测试:

java -Xmx9g -Xms6g -d64 -server

服务器上的内存:

    [root@….~]$ free -m
             total       used       free     shared    buffers     cached
Mem:         16017       1058      14958          1         41        758
-/+ buffers/cache:        259      15758
Swap:         1498          0       1498

Ulimit设置:

core file size          (blocks, -c) 1
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128053
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 64000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 128053
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Linux版本是SUSE Linux Enterprise Server 11(x86_64)。

Java版本:

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)

我发现实际上-Xmx8330m仍然有效,但不再使用-Xmx8331m。我不知道这里发生了什么,为什么我被限制在这个特定的内存分配上?
编辑: 确切的错误信息是:
root@…..:/root> java -d64 -Xmx9g -server
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.

谢谢! Indy


你有足够的空闲内存,所以这应该可以工作。我会使用更大的交换空间,比如8 GB - 32 GB(0.5x - 2x主内存),但我不认为这对你的情况有帮助。 - Peter Lawrey
2
你能否尝试使用Java 8进行比较,以检查这是否是在后续版本中修复的错误? - Peter Lawrey
1
当您使用“-Xmx8331m”或更高版本时会发生什么?JVM会提供错误消息吗? - mthmulders
添加了对确切错误信息的编辑说明;请注意,带有-Xmx8331的错误消息实际上是无法创建新的本机线程。它似乎可以成功分配堆本身,但在尝试分配额外内存时,在下一步中失败了。 - Indygoof
@Westranger 当然,使用较小的堆也可以正常工作。问题在于我这里实际上需要至少10GB的堆。我们现在可以讨论JVM为什么需要这么多的堆,以及Java应用程序应该更加优化,但是例如对于大型的Elasticsearch集群,通常会使用8-16GB的堆。 - Indygoof
显示剩余5条评论
1个回答

1

仅供参考,更新一下:

我现在已经将交换空间更改为8GB,现在它可以正常工作了。因此,似乎JVM在分配堆时会计算交换空间。

谢谢,Indy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接