欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 Threads(1)
            
    
    
        Java虚拟机数据结构SUNIBM 

##########################################


实际上,我们一般会对“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线程的交互,也就是上述两者的交互。