使用-Xss2G时出现JVM OutOfMemoryError

时间:2017-12-12 21:49:58

标签: java linux jvm

我遇到一个问题,当我尝试在Linux上以2G堆栈大小启动程序时,JVM几乎立即退出并出现内存不足错误。

这没有问题

-Xmx8G -Xss2047m

这些标志会立即导致jvm以内存不足异常退出

-Xmx8G -Xss2048m

这个盒子有32GB的内存,几乎没有其他东西在运行,所以我确定我实际上没有用完可用的内存。我认为存在某种系统限制,但我很难找出它实际上是什么。

我正在运行RHEL 7.4并使用OpenJDK 1.8.0_151

输出' ulimit -a':

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited 
scheduling priority             (-e) 0 
file size               (blocks, -f) unlimited 
pending signals                 (-i) 127929 
max locked memory       (kbytes, -l) 64 
max memory size         (kbytes, -m) unlimited 
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) 8192 
cpu time               (seconds, -t) unlimited 
max user processes              (-u) 8192 
virtual memory          (kbytes, -v) unlimited 
file locks                      (-x) unlimited

关于我应该调整什么以使其以2GB或更高版本运行的任何想法?

1 个答案:

答案 0 :(得分:3)

这是一个JVM错误。当ThreadStackSize四舍五入为1K的倍数时,该值将转换为int,请参阅arguments.cpp

  // Internally track ThreadStackSize in units of 1024 bytes.
  FLAG_SET_CMDLINE(intx, ThreadStackSize,
                          round_to((int)long_ThreadStackSize, K) / K);

因此,2G溢出为负数,稍后调用pthread_create失败。

错误JDK-8178491已在JDK 10中修复。

如果需要这么大的堆栈,很难想象一个真实的案例。但是,如果您真的想要创建一个堆栈超过2GB的线程,则可以使用Thread constructor作为参数接受stackSize

    public Thread(ThreadGroup group,
                  Runnable target,
                  String name,
                  long stackSize)