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