java虚拟机(一知半解)
基本java虚拟机介绍
java虚拟机 与 进程
一个Java虚拟就是一个进程,该进程只能运行一个java程序,创建了多个线程能够同时运行的条件,比如最重要的PC和栈。
进程是操作系统抽象出来的一个概念,用于方便计算机进行对运行时的程序进行管理。具体细节可参考:《深入理解计算机系统》
java虚拟机对于外部的环境来说(比如说操作系统,其他进程),是进程的身份。但是,对于其自身所包含的程序而言,它是一台计算机。
JVM内存模型
图1:JVM内存模型。
虚拟机 与 计算机
虚拟机为简化版本的计算机,绕口的说,在计算机中模拟的计算机。见图3.
- java虚拟机执行引擎,充当了控制器以及运算器的角色。
- java内存模型,相当于计算机中的内存,但是其在计算机内存的规则又增加了一些内容,比如说内存共享模型,使其虚拟机内存更加规格化,更加适用于java。
- IO在这里不在赘述。
图3:冯诺依曼体系结构。(来自:互动百科)
一个java程序如何在虚拟机中运行
图2:java程序执行。(图片来自:http://blog.****.net/cutesource/article/details/8244250)
java程序运行过程:
1.【编译】点击运行java程序,程序进行编译,连接。该步从编译原理中可以看具体细节。
2.【虚拟机】启动一个java虚拟机,用来作为java程序的容器。一个java虚拟机相当于一个进程,该进程的创建当然是由java的某个进程创建的。
3.【装载】容器已经生成,需要将程序装载进虚拟机里,于是就得到了上面的图1。编译之后的类文件,通过装载系统被装入到虚拟机中。
4.【类文件在虚拟机中】虚拟机是有着固定的结构的,类似于数据库表有着固定的列,模式。
- 【入口】虚拟机经过一系列本地方法等找到主类(这里所说的主类是我们编程中自己写的入口处的类,而非框架提供的一些前期准备,这里进行了一定的忽略),将主类中一些初始化等信息(在main方法之前执行)分配到虚拟机相应的结构中,换句话说,为方法的执行准备资源
- 【栈】将main函数相关信息放入java栈中,包括使用的局部变量,等。
- 【程序计数器】java栈顶元素表示的是当前需要执行的方法,那么接下来就应该执行程序了。(见图2)
- (1)代码定位。根据java栈顶的内容,从方法区找到相应的方法代码,初始化程序计数器。(需要指出的是,由于多线程以及方法调用的存在,程序计数器可能并非从代码开始处执行,可能在方法中间某行代码开始执行)程序计数器这里记录方法内偏移地址。
- (2)执行引擎。执行引擎执行相应的代码,将代码转为CPU可以识别的指令。代码被执行后,更新相应的资源,包括局部变量,堆等内容。
- (3)重复步骤(1)(2),直到中断(多线程,或者方法调用引起)。保存现场信息,栈顶被其他方法占据。
- 对新来的方法进行类似的处理。
多线程
多线程时需要考虑互斥的情况。多线程可以看做是多个流程在同时断断续续的执行,这些流程中会用到一些公用的资源,体现在java内存模型中为堆的共享,方法区的共享等。体现在java高级语言中为对象可以作为流程(方法)共享的资源,方法中的代码可以被多个线程共享。
所以便产生了java中锁的机制。锁的存在是为了避免各个流程访问资源的次序不当,造成程序的错误的发生,(比如,银行的存取的例子)。
参考:
Java中的多线程你只要看这一篇就够了
,