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

时间:2018-07-23 14:06:38

标签: multithreading memory jvm out-of-memory

当我们的系统内存不足时,我们会遇到OOM错误,但仍有2Go的可用内存之类的东西。

首先,我怀疑线程数限制,因此我进行了一些测试,以创建线程并更改-XX:ThreadStackSize。专用于堆栈大小的内存量似乎会影响线程的最大数量,但我无法解释如何实现。

示例。

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

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

  • -XX:ThreadStackSize=2300k = 4000个线程
  • -XX:ThreadStackSize=2400k = 1个线程

仅创建2400ko的一个线程而仍然有2Go的可用内存似乎很奇怪。 而且该过程似乎最多使用160Mo或剩余内存,但虚拟内存可以增长到9To

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

似乎heap + perm + ThreadStackSize * threads并不足够。

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

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

0 个答案:

没有答案