这种情况是无法创建本地线程,一般是操作系统内存不够导致。
根据OOM异常信息:无法创建新的本地线程得知是本地线程无法满足现有应用的使用。线程的内存分配属于栈区,栈区的大小是动态变化的,是系统内存在分配完给jvm及自己系统保留运行内存后的剩余的可用大小。
假设我们设置的–Xms -Xmx5G,保守估计系统保留500M运行内存,系统总的内存为8G
此时内存值剩余8-5.5=2.5G.所以目前只剩余2.5g内存供创建线程使用,根据-Xss默认为1M的线程栈大小得出可创建2500多个线程。(执行java -XX:+PrintFlagsFinal -version | grep ThreadStackSize 可以打印-Xss设定的值)
在生产上环境上执行命令
ps hH p <pid> | wc -l
查看了正常运行下的应用的进程的线程数为1000个。正常情况下线程数为平均值的75%。所以在偶发高峰期是很有可能达到极限的值。
解决方案:
1. 增加服务器内存
2. 减小-Xss的值