记一次OutOfMemoryError: unable to create new native thread
前言 今天在测试环境跑测试用例的时候发现一大片测试用例无法通过,查看日志发现 OutOfMemoryError: unable to create new native thread 。从日志信息来看,很明显,内存不足,无法创建本地线程。 遇到这个异常还是很意外的,测试用例大概就1.5k个,不至于跑个用例就来这么个异常,测试环境当时jvm的内存是4g,感觉不至于出现这个问题。(当然觉得意外的原因还是对jvm线程数量限制的理解有误) 要解决问题,首先,还是的了解jvm的线程数量到底受限哪些因素。 jvm线程数量限制 jvm线程受限于操作系统可用内存还是JVM的内存 1. Java线程的实现是基于底层系统的线程机制来实现的 ,程序中开的线程并不全部取决于JVM虚拟机栈,而是取决于CPU,操作系统,其他进程,Java的版本。JVM的线程与计算机本身性能相关。 这个很重要,不了解这一点,很容易像我之前一样误解为jvm线程个数首先于jvm的内存大小。 JVM线程的栈在64位Linux操作系统上的默认大小是多少 不显式设置-Xss或- XX:ThreadStackSize 时,在Linux x64上 ThreadStackSize 的默认值就是1024KB,给Java线程创建栈会用这个参数指定的大小。这是前一块代码的意思。如果把- Xss 或者 -XX:ThreadStackSize 设为0