Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用-Xss2G时出现JVM OutOfMemoryError_Java_Linux_Jvm - Fatal编程技术网

Java 使用-Xss2G时出现JVM OutOfMemoryError

Java 使用-Xss2G时出现JVM OutOfMemoryError,java,linux,jvm,Java,Linux,Jvm,我有一个问题,当我尝试在linux上启动一个2G堆栈大小的程序时,JVM几乎立即退出,并出现内存不足错误 这运行没有问题 -Xmx8G -Xss2047m 这些标志立即导致jvm退出,并出现内存不足异常 -Xmx8G -Xss2048m 这个盒子有32GB的内存,几乎没有其他东西在运行,所以我确信我的可用内存没有用完。我假设存在某种系统限制,但我正在努力找出它到底是什么 我正在运行RHEL7.4并使用OpenJDK1.8.0151 “ulimit-a”的输出: core file size

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

这运行没有问题

-Xmx8G -Xss2047m
这些标志立即导致jvm退出,并出现内存不足异常

-Xmx8G -Xss2048m
这个盒子有32GB的内存,几乎没有其他东西在运行,所以我确信我的可用内存没有用完。我假设存在某种系统限制,但我正在努力找出它到底是什么

我正在运行RHEL7.4并使用OpenJDK1.8.0151

“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或更高的环境下运行吗?

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

因此,2G溢出为负值,随后调用
pthread\u create
失败

这个错误在JDK10中已经修复

很难想象需要这么大的堆栈时会发生什么情况。但是,如果您真的想创建一个堆栈超过2GB的线程,可以使用接受
stackSize
作为参数:

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

你有多少线程?它只是一个启动单线程本机进程的包装器。线程数量非常少。-Xss是每个线程,也适用于JVM本身启动的后台线程。如果它正在包装本机进程,为什么还需要2G堆栈?有多少个?运行JFR-计算它们。现在计算出每个堆栈的2G倍。我想,这是OP处理特定Java代码所需堆栈量完全未指定且不可预测的事实的方法,因此当开发人员注意到某个大小有时不够时,因此,唯一的解决办法是投入更多的内存。在Java虚拟机中手动配置固定堆栈大小是一个非常不合时宜的做法,尤其是在以毫无意义的字节量指定大小的情况下…
    public Thread(ThreadGroup group,
                  Runnable target,
                  String name,
                  long stackSize)