聊聊JVM(五)从JVM角度理解线程
这篇说说如何从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角度理解线程相关推荐
- 深入理解JVM之代码执行机制与线程资源同步及交互机制
Java规范定义标准结构如图3.1 Java代码的执行机制 Java源码编译机制 javac将Java源码编译为class文件的步骤如图3.2 1.分析和输入到符号表(Parse and Enter) ...
- JVM(五)JVM调优
文章目录 一.调优实践 1.1 规划 1.1.1 规划步骤 1.1.2 规划案例 1.2 解决JVM运行过程中出现的问题 1.2.1 用jstack定位锁相关问题 1.2.2 OOM问题的定位方式 1 ...
- 深入理解Jvm(一)--内存理解
一.Java内存区域理解 Java与C++之间有一堵由内存动态分配(加载)和垃圾收集技术所围成的高墙,墙外面的1人想进去,墙内边的人想出去. 1.Jvm内存: Jvm在执行java程序的过程中会把Jv ...
- JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇
二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...
- jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码
jvm大局观之内存管理篇: 理解jvm安全点,写出更高效的代码 - 知乎 前言 本篇是java内存区域管理系列教程之一 - 在得知GC Root的组成之后,如何在垃圾回收发生的时刻,找到GC Root ...
- 深入理解JVM虚拟机_4 JVM内部结构分析-栈
深入理解JVM虚拟机_4 JVM内部结构分析-栈 作者:田超凡 原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂 栈 1. Java 虚拟机栈也是线程私有的,它的⽣命周期和线程相同,描述的是 Jav ...
- linux线程handler,Handler从源码角度理解
上一个文章讲解了Handler的基本使用,同时也有一些问题没有解决,本篇带你从源码的角度理解. 首先让我们来看看Handler的构造方法: image.png 我靠这么多的构造方法啊,我们上一篇只用了 ...
- 关于JVM参数-XX:SurvivorRatio的理解
关于JVM参数-XX:SurvivorRatio的理解 JVM参数中有一个比较重要的参数SurvivorRatio,它定义了新生代中Eden区域和Survivor区域(From幸存区或To幸存区)的比 ...
- jvm中关于slot的理解
jvm中关于slot的理解 参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束. 局部变量表,最基本的存储单元是slot(变量槽) 局部变量表中存放编译期可知的各种基本数据类型 ...
最新文章
- redis集合数据过期_如何从Redis中的集合中自动删除过期的密钥?
- 无线传输系统功率LCC功率补偿系统设计
- WebDev.WebServer.exe遇到问题需要关闭
- 学习matlab(十八)——小波分析
- 海康威视二次开发 python_海康威视面试python后端题
- m序列 MATLAB仿真
- 1M到底是等于多少K?
- 《2015年中国公有云服务发展报告》跋
- 经验谈:调查问卷问题设计“六忌”
- acer switch 10 linux,【AcerSwitch10E评测】拆开来用的电脑 Acer Switch 10E评测(全文)_Acer Switch 10E_笔记本评测-中关村在线...
- js实现排列组合算法(全排列)
- win7音量图标不见了怎么办
- Chrome插件扩展程序的默认安装目录
- 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭
- 程序员的高效工作场所
- POJ 2210 Metric Time G++
- 白色恋人--18首扣人心弦的经典情歌
- |2105|小泉的难题
- JavaScript之Three.js
- [转载] 七龙珠第一部——第036话 恐怖的玛斯鲁塔
热门文章
- 数据库原理与应用(SQL Server)笔记 第五章 索引和视图
- 数据库原理与应用(SQL Server)笔记 第三章 连接查询
- 加工中心刻字宏程序_【宏程序高级案例】涡轮发动机转动轴叶轮的编程思路与程序解析...
- Python中的集合
- apriori算法代码python_Apriori算法的Python实现
- python笔记之序列(dict的基本使用和常用操作)
- mysql 索引都有哪些_MySQL 数据库的优化,你知道有哪些?
- mongo mapreduce java_那位帮忙提供一个java mongodb多个collection进行mapreduce的操作。
- 处理中文乱码_为什么PDF转换成Word后是乱码?这种PDF要怎么转换?
- python发红包问题_一个关于红包的问题引发的python算法初体验