创建线程需要调用OS API,为了更好的理解创建并启动一个线程的开销,JVM 后台主要的操作:
- 为一个线程栈分配内存,该栈为每个线程方法调用保存一个栈帧;
- 每一栈帧由一个局部变量数组、返回值、操作数堆栈和常量池组成;
- 一些支持本机方法的 jvm 也会分配一个本机堆栈;
- 每个线程获得一个程序计数器,告诉它当前处理器执行的指令是什么;
- 系统创建一个与Java线程对应的本机线程;
- 将与线程相关的描述符添加到JVM内部数据结构中;
- 线程共享堆和方法区域;
下面查看JVM内存信息
java -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics -version
这是Java17 的结果,13个线程,预留和提交的大概都是13000+KB,平均每个线程大概需要 1M 左右的大小,不同版本结果有差异。