Multithreading 阻止java.lang.OutOfMemoryError:无法创建新的本机线程

Multithreading 阻止java.lang.OutOfMemoryError:无法创建新的本机线程,multithreading,memory,jvm,out-of-memory,Multithreading,Memory,Jvm,Out Of Memory,当我们的系统内存不足时,我们会遇到OOM错误,但仍然有一些问题,比如2Go的可用内存 首先,我怀疑有线程数限制,所以我做了一个小测试,创建线程并改变-XX:ThreadStackSize。专用于堆栈大小的内存量似乎会影响线程的最大数量,但我无法解释如何影响 例如 通过设置-XX:ThreadStackSize=2000k可以创建11000个 似乎是一个硬限制) -XX:ThreadStackSize=2100k=11000个线程 -XX:ThreadStackSize=2200k=9000个线

当我们的系统内存不足时,我们会遇到OOM错误,但仍然有一些问题,比如2Go的可用内存

首先,我怀疑有线程数限制,所以我做了一个小测试,创建线程并改变
-XX:ThreadStackSize
。专用于堆栈大小的内存量似乎会影响线程的最大数量,但我无法解释如何影响

例如

  • 通过设置
    -XX:ThreadStackSize=2000k
    可以创建11000个 似乎是一个硬限制)
  • -XX:ThreadStackSize=2100k
    =11000个线程

  • -XX:ThreadStackSize=2200k
    =9000个线程

  • -XX:ThreadStackSize=2300k
    =4000个线程
  • -XX:ThreadStackSize=2400k
    =1个线程
当仍然有
2Go
的可用内存时,只创建一个
2400ko
线程似乎很奇怪。 这个过程似乎使用了最大
160Mo
或剩余内存,但虚拟内存可以增长到
9To

我不明白什么是限制,什么是可接受的还是不可接受的。 当我们必须决定是否可以在服务器上添加JVM应用程序时,这是一个问题

似乎
heap+perm+ThreadStackSize*threads
不是enougt

因为将
1Go
应用程序添加到具有
2Go
可用内存的服务器乍一看似乎不错


为什么在达到最大内存之前内存不足?如何计算JVM应用程序所需的内存量?

使用“2Go”或“9To”是什么意思?
o
在这里代表
Byte
吗?除了线程堆栈大小之外,还有许多其他因素可能会限制线程计数,例如
ulimit-u
kernel.pid\u max
kernel.threads max
sysctl。@PhilippLudwig抱歉,我是法国人,在法国我们常说Byte的八位字节(这比
b
或大写
b
要明确得多,所以是的,它的意思是
Byte
@apangin我同意,但是
threadStackSize
如何影响这些其他值呢?例如,如果限制是
内核。threads max
在更改
threadStackSize
,否?
threadStackSize
不会影响ulimit和sysctl限制。我想说的是,您可能会看到
OutOfMemoryError
不是因为线程堆栈大小,而是因为其他限制。请尝试
strace-f-e trace=clone
查找原因。