我遇到一个问题,当我尝试在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或更高版本运行的任何想法?
答案 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)