我的 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 内存不足问题。