Linux / JVM - OutOfMemoryError:无法创建新的本机线程

Linux / JVM - OutOfMemoryError:无法创建新的本机线程

我的 Linux 服务器 (CentOS) 出现内存问题。它是一个虚拟机。以下是上下文。

它有 70Gb 的 RAM。有2个tomcat在上面运行。

一个 tomcat 分配了 13Gb 的堆,另一只分配了 20Gb 的堆。

20Gb 的具有 JVM 选项 -Xss160k 设置(以尝试解决我的问题)。

这 2 个 tomcat 最多可以使用 48Gb RAM(虚拟)

Linux 将使用 70Gb,并且将有大约 35Gb 的缓存内存。交换空间为 1Gb,但几乎没有使用任何空间(8Mb)。

现在的问题是我经常从 tomcat 收到以下错误:

OutOfMemoryError: unable to create new native thread

如果我没记错的话,如果操作系统本身内存不足并因此无法创建新线程,就会发生这种情况。

现在的问题是:当它有 35Gb 的缓存内存时,这怎么可能呢?难道不应该重新分配它并根据需要使用它吗?

我可以设置一些内核选项来避免这种情况吗?例如,它最多可以使用 65Gb、缓存 30Gb 并保留 5Gb 空闲。

答案1

这可能是 ulimit 设置的限制问题。作为运行 tomcat 的用户,执行以下操作

ulimit -a

在输出中,查找行max user processes.

max user processes              (-u) 1024

在启动 tomcat 之前尝试提高该值,例如ulimit -u 4096

答案2

我发现了如何确保我有 X 数量的可用 RAM:

sysctl -w vm.min_free_kbytes=...

我还不知道这是否能解决我的问题,或者 Jenny D 的回答是否能解决。

答案3

Xms,Xmx,PermSize MaxPermSize您的 Catalina 文件有什么价值?通常,我发现调整这些参数可以避免 JVM 内存不足问题。

相关内容