java.lang.OutOfMemoryError: unable to create new native thread排查

本文讨论了Java应用程序遇到的内存溢出和无法创建新线程的问题,指出当创建线程超过系统限制时,可能会导致此类异常。异常的根本原因是进程内存、JVM内存和操作系统预留内存之间的平衡。通过计算最大线程数公式来解释问题本质,并提供了解决方案,包括临时和永久增加系统最大进程数(pid_max)。针对该问题,建议监控系统资源使用,合理设置线程池大小,避免服务器进程饱和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、java.lang.OutOfMemoryError: unable to create new native thread

在这里插入图片描述

2、java.io.IOException: Cannot run program “/bin/sh”: error=12, Cannot allocate memory

在这里插入图片描述

场景

测试机项目早上突然500,不能正常访问

异常分析

这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

  • MaxProcessMemory 指的是一个进程的最大内存
  • JVMMemory JVM内存
  • ReservedOsMemory 保留的操作系统内存
  • ThreadStackSize 线程栈的大小

异常分析

上述都是在考虑线程的问题,线程又受到服务器进程的限制,难道是服务器上的进程数超最大限制了?

1.查看最大进程数 sysctl kernel.pid_max
2.查看当前进程数 ps -eLf | wc -l

在这里插入图片描述

打命令就界面提示 -bash: fork: Cannot allocate memory 一直提示:无法分配内存
最后排查到问题点了 就是进程连接满了 无法连接上新进程了
如果都连不上 那就没办法了,只能重启测试机了

解决方案

系统默认的pid_max 值为32768

1.临时修改最大进程数 [重启后就失效]
echo 1000000 > /proc/sys/kernel/pid_max
2.永久生效
echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf
sysctl -p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值