Java虚拟机规范
按照Java虚拟机规范,其结构包括:子系统、内存区、数据类型、指令。
规范本身通过定义这些抽象的组成部分以及它们之间的交互,来定义任何Java虚拟机实现都必须遵守此结构来实现具体的Java虚拟机
Java虚拟机的内部体系结构
类装载器子系统
每个Java虚拟机都有一个类装载器子系统,它根据给定的全限名来装入类型(类或接口)
执行引擎
每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令
运行时数据区
当Java虚拟机运行一个程序时,它需要内存来存储许多东西,例如,字节码、从已装载的class文件中得到的其它信息,程序创建的对象,传递给方法的参数、返回值、局部变量、以及运算的中间结果等等,Java虚拟机把这些东西都组织到几个”运行时数据区”中,以便于管理
方法区及堆
每个Java虚拟机实例都有一个方法区以及一个堆,它们是由该虚拟机所有线程共享的.
当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息。然后它把这些类型信息放到方法区中。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中
Java栈及pc寄存器(程序计数器)
Java虚拟机中的每条线程拥有自己的Java栈及程序计数器.
当一个新线程被创建时,它都将得到它自己的pc寄存器以及一个Java栈,如果线程正在执行的是一个Java方法(非本地方法),那么pc寄存器的值将总是指示下一条将被执行的指令,而它的Java栈则总是存储该线程中Java方法调用的状态(包括它的局部变量、被调用时传进来的参数、它的返回值,以及运算的中间结果等等)
注意:
1:每个方法都有自己的各种属性,这些内容不是一起混在Java栈中的,而是每个方法自已的各种属性都存放于Java栈帧(stack frame)中的。Java栈是由许多栈帧组成的,当线程调用一个Java方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧从Java栈中弹出并抛弃.
2:Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。这样设计的原因是为了保持Java虚拟机的指令集尽量紧凑,同时也便于Java在那些只有很少通用寄存器的平台上实现。另外Java虚拟机的这种基于栈的体系结构,也有助于运行时某些虚拟机实现的动态编译器和即时编译器的代码优化.
本地方法栈
本地方法调用的状态,以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或者其他某些与特定实现相关的内存区中.