JVM 线程

JVM 线程

这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。run() 返回时,被处理未捕获异常,原生线程将确认由于它的结束是否要终止 JVM 进程(比如这个线程是最后一个非守护线程)。

当线程结束时,会释放原生线程和 Java 线程的所有资源。对于整个 JVM 的学习中,我们会关注到线程独有的譬如内存区域中的程序计数器、虚拟机栈、本地栈和栈帧、局部变量数组、操作数栈、动态链接,以及线程共享的堆、非堆内存、内存管理、即时编译 JIT、方法区、类文件结构、类加载器、运行时常量池、异常表、符号表以及 Interned 字符串等等。

如果使用 jconsole 或者其它调试器,你会看到很多线程在后台运行。这些后台线程与触发 public static void main(String[]) 函数的主线程以及主线程创建的其他线程一起运行。Hotspot JVM 后台运行的系统线程主要有下面几个:

线程类型 说明
虚拟机线程(VM thread) 这个线程等待 JVM 到达安全点操作出现。这些操作必须要在独立的线程里执行,因为当堆修改无法进行时,线程都需要 JVM 位于安全点。这些操作的类型有:stop-the-world 垃圾回收、线程栈 dump、线程暂停、线程偏向锁(biased locking)解除
周期性任务线程 这线程负责定时器事件(也就是中断),用来调度周期性操作的执行
GC 线程 这些线程支持 JVM 中不同的垃圾回收活动,
编译器线程 这些线程在运行时将字节码动态编译成本地平台相关的机器码,
信号分发线程 这个线程接收发送到 JVM 的信号并调用适当的 JVM 方法处理,