Java虚拟机的体系结构解读(1),java虚拟机
Java虚拟机的体系结构解读(1),java虚拟机
一个 Java 虚拟机实例的天职就是:负责运行一个 Java 程序。当启动一个 Java 程序时,一个虚拟机实例就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果在同一台计算机上同时运行三个 Java 程序,将得到三个 Java 虚拟机实例。每个 Java 程序都运行于它自己的 Java 虚拟机实例中 。
Java 虚拟机实例通过调用某个初始类的 main() 方法来运行一个 Java 程序。任何拥有这样一个 main() 方法的类都可以作为 Java 程序运行的起点 。
Java 虚拟机内部有两种线程:守护线程与非守护线程。守护线程通常是由虚拟机自己使用的,比如执行垃圾回收任务的线程。但是, Java 程序也可以把它创建的任何线程标记为守护线程。 Java 程序中的初始线程——就是开始于 main() 的线程,是非守护线程。
在 Java 虚拟机规范中,一个虚拟机实例的行为时分别按照子系统、内存区、数据类型一级指令这个几个术语来描述。这些组成部分仪器展示了抽象的虚拟机的内部抽象体系结构。
图 1 Java 虚拟机内部体系结构
其中,某些运行时数据区时有程序中所有线程共享的,还有一些则只能由一个线程拥有。每个Java虚拟机实例都有一个方法区以及一个堆,他们是有该虚拟机实例中所有线程共享的。当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息。然后,它把这些类型信息放在方法区。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放在堆中。
图 2 所有线程共享的数据
除这两种,其他的运行时数据都是每个线程专有的。当每一个新线程被创建的时,它都将得到它自己的PC寄存器(程序计数器)以及一个Java栈。如果线程正在执行的是一个Java方法(非本地方法),那么PC寄存器的值将总是指示下一条将被执行的指令,而它的Java栈则总是存储该线程中Java方法调用的状态——包括它的局部变量,被调用时传进来的参数,它的返回值,以及运算的中间结果等等。
Java栈是由许多栈帧(stack frame)组成,一个栈帧包含一个Java方法调用的状态。当线程调用一个Java方法时,在虚拟机压入一个新的栈帧到该线程的Java栈中;当该方法返回时,这个栈帧被从Java虚拟机中弹出并抛弃。
Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。这样设计的原因是为了保持Java虚拟机的指令集紧凑,同时也便于Java虚拟机的那些只有很少同意寄存器的平台上实现。
图 3 线程专有的运行时数据
上图展示了一个虚拟机实例的快照,它有三个线程正在执行。线程1、线程2都正在执行Java方法,而线程3正在执行一个本地方法。当前正在执行的方法的栈帧则是浅色表示。对于一个正在运行的Java方法的线程而言,它的PC寄存器总是指向下一条被执行的指令。
相关文章
- 暂无相关文章
用户点评