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