JVM-线程堆栈等数据分析
参考文献
JVM
线程模型
线程创建和销毁
- 在语言层面,线程对应的类是
java.lang.Thread
,启动方法为Thread#start()
。 - 在
Java
线程启动时会创建底层线程(native Thread
,在任务执行完成后会自动回收。 JVM
中所有线程都交给操作系统来负责调度,以将线程分配到可用的 CPU 上执行
线程状态
- 从
JVM
的角度看,线程状态主要包括 4 种:_thread_new
:正在初始化的新线程_thread_in_Java
:正在执行 Java 代码的线程_thread_in_vm
:在 JVM 内部执行的线程_thread_blocked
:由于某种原因被阻塞的线程(例如获取锁、等待条件、休眠、执行阻塞的 I/O 操作等等)
JVM
内部线程
-
JVM 内部线程主要分为以下几种:
- VM 线程: 单例的VMThread对象,负责执行 VM 操作,下文将对此进行讨论;
- 定时任务线程: 单例的WatcherThread对象,模拟在 VM 中执行定时操作的计时器中断;
- GC 线程: 垃圾收集器中,用于支持并行和并发垃圾回收的线程;
- 编译器线程: 将字节码编译为本地机器代码;
- 信号分发线程: 等待进程指示的信号,并将其分配给 Java 级别的信号处理方法。
-
JVM
中的所有线程都是Thread
实例,而所有执行Java
代码的线程都是(Thread
的子类)JavaThread
的实例。 -
JVM
在链表Threads_list
中跟踪所有线程,并使用Threads_lock
来保护(这是 JVM 内部使用的一个核心同步锁)。
线程间协调与通信
- 线程之间有多种通信方式,例如:
- 线程等待,使用 threadA.join() 方法,可以让当前线程等待另一个线程执行结束后进行“汇合”
- 同步(Synchronization),包括 synchronized 关键字以及 object.wait()、object.notify()
- 使用并发工具类,常见的包括 CountdownLatch 类、CyclicBarrier 类等等
- 可管理的线程池相关接口,比如:FutureTask 类、Callable 接口等等
- Java 还支持其他的同步机制,例如 volatile 域以及 java.util.concurrent 包(有时候简称 juc)中的类
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!