Java虚拟机的体系结构解读(1)

      一个 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虚拟机的那些只有很少同意寄存器的平台上实现。

线程专有的运行时数据

 

上图展示了一个虚拟机实例的快照,它有三个线程正在执行。线程1、线程2都正在执行Java方法,而线程3正在执行一个本地方法。当前正在执行的方法的栈帧则是浅色表示。对于一个正在运行的Java方法的线程而言,它的PC寄存器总是指向下一条被执行的指令。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值