内存溢出,无法创建新的本地线程的原因和解决方案
java.lang.OutofMemoryError:unable to create new natinve thread
可能原因
1、内存耗尽
2、超过了系统设置的线程数阈值
解决方法:(首先是排除了代码问题之后)
1、用jstack 排查应用是否创建了过多的线程
相关指令
jps -ml
jstack pid (pid指的是进程号)
查询线程数 jstack -l 28367 | grep 'java.lang.Thread.State' | wc -l
2、调整操作系统线程数阀值
ulimit -u
若阀值的大小太小,则可能导致oom
3、减小堆内存的大小 配置 -Xms 和 -Xmx
查看线程的jvm信息
查看堆的最大内存的大小 -Xmx jinfo -flag MaxHeapSize pid
查看堆的初始内存的大小-Xms jinfo -flag InitialHeapSize pid
4、减少线程数
查看最大进程数 sysctl kernel.pid_max
当前线程数 ps -eLf | wc -l
修改最大进程数后系统恢复echo 1000000 > /proc/sys/kernel/pid_max
永久生效echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf sysctl -p
5、减小线程栈的大小 配置 -Xss 256k
查看java线程栈的大小 java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
查看线程栈的大小 jinfo -flag ThreadStackSize pid
6、增大os对线程的限制
如果使用 Red Hat Enterprise Linux 6 ,编辑/etc/security/limits.d/90-nproc.conf,添加如下配置
# /etc/security/limits.d/90-nproc.conf
* soft nproc unlimited
user - nproc 2048