本文来自:HeapDump性能社区
概述
虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从 JVM 源码角度来分析,更多的来自于 Linux Kernel 的源码分析,今天要说的是 JVM 里比较常见的一个问题。
这个问题可能有几种表述
- 一个Java进程到底能创建多少线程?
- 到底有哪些因素决定了能创建多少线程?
java.lang.OutOfMemoryError: unable to create new native thread
的异常究竟是怎么回事
不过我这里先声明下可能不能完全百分百将各种因素都理出来,因为毕竟我不是做 Linux Kernel 开发的,还有不少细节没有注意到的,我将我能分析到的因素和大家分享一下,如果大家在平时工作中还碰到别的因素,欢迎在文章下面留言,让更多人参与进来讨论
从 JVM 说起
线程大家都熟悉,new Thread().start()
即会创建一个线程,这里我首先指出一点new Thread()
其实并不会创建一个真正的线程,只有在调用了 start 方法之后才会创建一个线程,这个大家分析下 Java 代码就知道了,Thread 的构造函数是纯 Java 代码,start 方法会调到一个 native 方法 start0 里,而 start0 其实就是JVM_StartThread
这个方法。
从上面代码里首先要大家关注下最后的那个 if 判断 if (native_thread->osthread() == NULL)
,如果 osthread 为空,那将会抛出大家比较熟悉的 unable to create new n