当我们的系统内存不足时,我们会遇到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应用程序所需的内存量?