Java Threads(1) Java虚拟机数据结构SUNIBM
程序员文章站
2024-01-23 16:31:22
...
一直想深入研究Java线程,弥补Java基础知识的匮乏,然后形成一些言之有物的文章。可惜没有大块的空余时间,只能象堆积木一样,慢慢的往上堆了。
为了解Java线程,从大处入手应该是个不错的主意。我认为首先就需要对Java Platform有一定的了解。我一般会把Java Platform分为4部分:
1、Java Language
Java语言主要是有关Java的语法等
2、Java Class File
Java源码必须编译成二进制的Class文件才能通过VM来运行,关于Class File的结构等
3、Java Virtual Machine
Java虚拟机是Class File的执行引擎,是Java程序能否运行的关键。关于VM的内存管理、指令、线程等
4、Java API
公共的API是任何程序语言必不可少的部分,如果没有API,编写程序非得累死不可。
从Java Platform的4部分可以看出,要了解Java线程,就需要对Java VM和有关线程的API(第3和4)集中火力进行研究。
我们就先从Java VM开始,如果对VM没有丁点概念,我推荐一本非常不错的书:《Inside the Java Virtual Machine》,现在是second edition,作者是Bill Venners。国内已经有人对该书进行了翻译,译者是曹晓钢和蒋靖(感谢),在大多数书店都有出售。
在该书中,有一幅描述Java VM体系结构的图片,我觉得非常的好,看过这一幅图片就会对VM有一个非常直接的印象,然后如庖丁解牛般的进行分解就会起到事倍功半的效果。
##########################################
实际上,我们一般会对“Java虚拟机”这个术语有三种不同的理解:
1、抽象规范
Sun公司制定的《The Java Virtual Machine Specification》就是抽象规范,任何想实现Java VM就必须遵守这个规范。
2、具体实现
所有的JDK中都会包含Java VM的具体实现和Java API,Sun、IBM和Bea等几家厂商就实现了各自的VM,它们的实现细节是一定是不同的,但是它们都必须遵守抽象规范。
3、正在运行的实例
当我们编写的Java程序运行时,就是有VM的实例在运行。
在考虑底层系统时,我们一般会比较注意CPU和存储器,CPU完成运算指令调度,存储器存储运算中间结果,这也是冯.偌依曼机最重要的两部分。
冯.偌依曼机的基本思路:
* 采用二进制形式表示数据和指令;
* 程序与数据预先存入主存,工作时连续自动高速顺序执行.
* 由运算器,存储器,控制器,I/O设备五大部分组成。
它的核心就是“存储程序”的思想,我们从中可以看出Java VM与冯.偌依曼机的基本思路相当一致。
从前一篇blog的经典图片中,我们就能完全理解VM的整体结构,也会明白虚拟机结构中最重要的两部分:
1、运行时数据区
就是存储器,包含多种不同形式的数据区,譬如方法区、堆和Java栈等。运行时数据区可以存储字节码、对象、局部变量以及运算的中间结果等。
2、执行引擎
任何Java VM实现的核心都是它的执行引擎,有点类似于CPU,执行引擎进行指令调度,Java VM有自身、独立的指令集。
执行引擎与Java VM一样,也有三种不同的理解,包括抽象规范、具体实现和运行时的实例。
作为运行时实例的执行引擎就是一个线程,正在运行的Java程序中的每一个线程都是一个独立的虚拟机执行引擎的实例。
Java VM一般会存在两种不同的线程:一种是对用户程序不可见的,这样的线程不需要是实现的执行引擎的实例,譬如GC;另外一种就是属于用户运行程序的线程,这些线程都是在实际工作的执行引擎。
在《The Java Virtual Machine Specification》的第8章中详细介绍了“线程和锁”,它主要就是规范了共享主存储器与Java VM线程的交互,也就是上述两者的交互。
为了解Java线程,从大处入手应该是个不错的主意。我认为首先就需要对Java Platform有一定的了解。我一般会把Java Platform分为4部分:
1、Java Language
Java语言主要是有关Java的语法等
2、Java Class File
Java源码必须编译成二进制的Class文件才能通过VM来运行,关于Class File的结构等
3、Java Virtual Machine
Java虚拟机是Class File的执行引擎,是Java程序能否运行的关键。关于VM的内存管理、指令、线程等
4、Java API
公共的API是任何程序语言必不可少的部分,如果没有API,编写程序非得累死不可。
从Java Platform的4部分可以看出,要了解Java线程,就需要对Java VM和有关线程的API(第3和4)集中火力进行研究。
我们就先从Java VM开始,如果对VM没有丁点概念,我推荐一本非常不错的书:《Inside the Java Virtual Machine》,现在是second edition,作者是Bill Venners。国内已经有人对该书进行了翻译,译者是曹晓钢和蒋靖(感谢),在大多数书店都有出售。
在该书中,有一幅描述Java VM体系结构的图片,我觉得非常的好,看过这一幅图片就会对VM有一个非常直接的印象,然后如庖丁解牛般的进行分解就会起到事倍功半的效果。
##########################################
实际上,我们一般会对“Java虚拟机”这个术语有三种不同的理解:
1、抽象规范
Sun公司制定的《The Java Virtual Machine Specification》就是抽象规范,任何想实现Java VM就必须遵守这个规范。
2、具体实现
所有的JDK中都会包含Java VM的具体实现和Java API,Sun、IBM和Bea等几家厂商就实现了各自的VM,它们的实现细节是一定是不同的,但是它们都必须遵守抽象规范。
3、正在运行的实例
当我们编写的Java程序运行时,就是有VM的实例在运行。
在考虑底层系统时,我们一般会比较注意CPU和存储器,CPU完成运算指令调度,存储器存储运算中间结果,这也是冯.偌依曼机最重要的两部分。
冯.偌依曼机的基本思路:
* 采用二进制形式表示数据和指令;
* 程序与数据预先存入主存,工作时连续自动高速顺序执行.
* 由运算器,存储器,控制器,I/O设备五大部分组成。
它的核心就是“存储程序”的思想,我们从中可以看出Java VM与冯.偌依曼机的基本思路相当一致。
从前一篇blog的经典图片中,我们就能完全理解VM的整体结构,也会明白虚拟机结构中最重要的两部分:
1、运行时数据区
就是存储器,包含多种不同形式的数据区,譬如方法区、堆和Java栈等。运行时数据区可以存储字节码、对象、局部变量以及运算的中间结果等。
2、执行引擎
任何Java VM实现的核心都是它的执行引擎,有点类似于CPU,执行引擎进行指令调度,Java VM有自身、独立的指令集。
执行引擎与Java VM一样,也有三种不同的理解,包括抽象规范、具体实现和运行时的实例。
作为运行时实例的执行引擎就是一个线程,正在运行的Java程序中的每一个线程都是一个独立的虚拟机执行引擎的实例。
Java VM一般会存在两种不同的线程:一种是对用户程序不可见的,这样的线程不需要是实现的执行引擎的实例,譬如GC;另外一种就是属于用户运行程序的线程,这些线程都是在实际工作的执行引擎。
在《The Java Virtual Machine Specification》的第8章中详细介绍了“线程和锁”,它主要就是规范了共享主存储器与Java VM线程的交互,也就是上述两者的交互。