这篇说说如何从JVM的角度来理解线程,可以对Java的线程模型有一个更加深入的理解,对GC的一些细节也会理解地更加深刻。本文基于HotSpot的OpenJDK7实现。

我们知道JVM主要是用C++实现的,JVM定义的Thread的类继承结构如下:

Class hierarchy
 - Thread
   - NamedThread
     - VMThread
     - ConcurrentGCThread
     - WorkerThread
       - GangWorker
       - GCTaskThread
   - JavaThread
   - WatcherThread

另外还有一个重要的类OSThread不在这个继承关系里,它以组合的方式被Thread类所使用

这些类构成了JVM的线程模型,其中最主要的是下面几个类:

java.lang.Thread: 这个是Java语言里的线程类,由这个Java类创建的instance都会 1:1 映射到一个操作系统的osthread

JavaThread: JVM中C++定义的类,一个JavaThread的instance代表了在JVM中的java.lang.Thread的instance, 它维护了线程的状态,并且维护一个指针指向java.lang.Thread创建的对象(oop)。它同时还维护了一个指针指向对应的OSThread,来获取底层操作系统创建的osthread的状态

OSThread: JVM中C++定义的类,代表了JVM中对底层操作系统的osthread的抽象,它维护着实际操作系统创建的线程句柄handle,可以获取底层osthread的状态

VMThread: JVM中C++定义的类,这个类和用户创建的线程无关,是JVM本身用来进行虚拟机操作的线程,比如GC。

有两种方式可以让用户在JVM中创建线程

1. new java.lang.Thread().start()

2. 使用JNI将一个native thread attach到JVM中

针对 new java.lang.Thread().start()这种方式,只有调用start()方法的时候,才会真正的在JVM中去创建线程,主要的生命周期步骤有:

1. 创建对应的JavaThread的instance

2. 创建对应的OSThread的instance

3. 创建实际的底层操作系统的native thread

4. 准备相应的JVM状态,比如ThreadLocal存储空间分配等

5. 底层的native thread开始运行,调用java.lang.Thread生成的Object的run()方法

6. 当java.lang.Thread生成的Object的run()方法执行完毕返回后,或者抛出异常终止后,终止native thread

7. 释放JVM相关的thread的资源,清除对应的JavaThread和OSThread

针对JNI将一个native thread attach到JVM中,主要的步骤有:

1. 通过JNI call AttachCurrentThread申请连接到执行的JVM实例

2. JVM创建相应的JavaThread和OSThread对象

3. 创建相应的java.lang.Thread的对象

4. 一旦java.lang.Thread的Object创建之后,JNI就可以调用Java代码了

5. 当通过JNI call DetachCurrentThread之后,JNI就从JVM实例中断开连接

6. JVM清除相应的JavaThread, OSThread, java.lang.Thread对象

从JVM的角度来看待线程状态的状态有以下几种:

其中主要的状态是这5种:

_thread_new: 新创建的线程

_thread_in_Java: 在运行Java代码

_thread_in_vm: 在运行JVM本身的代码

_thread_in_native: 在运行native代码

_thread_blocked: 线程被阻塞了,包括等待一个锁,等待一个条件,sleep,执行一个阻塞的IO等

从OSThread的角度,JVM还定义了一些线程状态给外部使用,比如用jstack输出的线程堆栈信息中线程的状态:

比较常见有:

Runnable: 可以运行或者正在运行的

MONITOR_WAIT: 等待锁

OBJECT_WAIT: 执行了Object.wait()之后在条件队列中等待的

SLEEPING: 执行了Thread.sleep()的

从JavaThread的角度,JVM定义了一些针对Java Thread对象的状态,基本类似,多了一个TIMED_WAITING的状态,用来表示定时阻塞的状态

最后来看一下JVM内部的VM Threads,主要由几类:

VMThread: 执行JVM本身的操作

Periodic task thread: JVM内部执行定时任务的线程

GC threads: GC相关的线程,比如单线程/多线程的GC收集器使用的线程

Compiler threads: JIT用来动态编译的线程

Signal dispatcher thread: Java解释器Interceptor用来辅助safepoint操作的线程

具体的VMThread的作用,会在讲safepoint的时候细说,就写到这里吧

参考:  Hotspot JVM thread management

聊聊JVM(五)从JVM角度理解线程相关推荐

  1. 深入理解JVM之代码执行机制与线程资源同步及交互机制

    Java规范定义标准结构如图3.1 Java代码的执行机制 Java源码编译机制 javac将Java源码编译为class文件的步骤如图3.2 1.分析和输入到符号表(Parse and Enter) ...

  2. JVM(五)JVM调优

    文章目录 一.调优实践 1.1 规划 1.1.1 规划步骤 1.1.2 规划案例 1.2 解决JVM运行过程中出现的问题 1.2.1 用jstack定位锁相关问题 1.2.2 OOM问题的定位方式 1 ...

  3. 深入理解Jvm(一)--内存理解

    一.Java内存区域理解 Java与C++之间有一堵由内存动态分配(加载)和垃圾收集技术所围成的高墙,墙外面的1人想进去,墙内边的人想出去. 1.Jvm内存: Jvm在执行java程序的过程中会把Jv ...

  4. JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...

  5. jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码

    jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码 - 知乎 前言 本篇是java内存区域管理系列教程之一 - 在得知GC Root的组成之后,如何在垃圾回收发生的时刻,找到GC Root ...

  6. 深入理解JVM虚拟机_4 JVM内部结构分析-栈

    深入理解JVM虚拟机_4 JVM内部结构分析-栈 作者:田超凡 原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂 栈 1. Java 虚拟机栈也是线程私有的,它的⽣命周期和线程相同,描述的是 Jav ...

  7. linux线程handler,Handler从源码角度理解

    上一个文章讲解了Handler的基本使用,同时也有一些问题没有解决,本篇带你从源码的角度理解. 首先让我们来看看Handler的构造方法: image.png 我靠这么多的构造方法啊,我们上一篇只用了 ...

  8. 关于JVM参数-XX:SurvivorRatio的理解

    关于JVM参数-XX:SurvivorRatio的理解 JVM参数中有一个比较重要的参数SurvivorRatio,它定义了新生代中Eden区域和Survivor区域(From幸存区或To幸存区)的比 ...

  9. jvm中关于slot的理解

    jvm中关于slot的理解 参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束. 局部变量表,最基本的存储单元是slot(变量槽) 局部变量表中存放编译期可知的各种基本数据类型 ...

最新文章

  1. redis集合数据过期_如何从Redis中的集合中自动删除过期的密钥?
  2. 无线传输系统功率LCC功率补偿系统设计
  3. WebDev.WebServer.exe遇到问题需要关闭
  4. 学习matlab(十八)——小波分析
  5. 海康威视二次开发 python_海康威视面试python后端题
  6. m序列 MATLAB仿真
  7. 1M到底是等于多少K?
  8. 《2015年中国公有云服务发展报告》跋
  9. 经验谈:调查问卷问题设计“六忌”
  10. acer switch 10 linux,【AcerSwitch10E评测】拆开来用的电脑 Acer Switch 10E评测(全文)_Acer Switch 10E_笔记本评测-中关村在线...
  11. js实现排列组合算法(全排列)
  12. win7音量图标不见了怎么办
  13. Chrome插件扩展程序的默认安装目录
  14. 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭
  15. 程序员的高效工作场所
  16. POJ 2210 Metric Time G++
  17. 白色恋人--18首扣人心弦的经典情歌
  18. |2105|小泉的难题
  19. JavaScript之Three.js
  20. [转载] 七龙珠第一部——第036话 恐怖的玛斯鲁塔

热门文章

  1. 数据库原理与应用(SQL Server)笔记 第五章 索引和视图
  2. 数据库原理与应用(SQL Server)笔记 第三章 连接查询
  3. 加工中心刻字宏程序_【宏程序高级案例】涡轮发动机转动轴叶轮的编程思路与程序解析...
  4. Python中的集合
  5. apriori算法代码python_Apriori算法的Python实现
  6. python笔记之序列(dict的基本使用和常用操作)
  7. mysql 索引都有哪些_MySQL 数据库的优化,你知道有哪些?
  8. mongo mapreduce java_那位帮忙提供一个java mongodb多个collection进行mapreduce的操作。
  9. 处理中文乱码_为什么PDF转换成Word后是乱码?这种PDF要怎么转换?
  10. python发红包问题_一个关于红包的问题引发的python算法初体验