Java虚拟机阵营:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM…
启动流程
?
?
JVM由三个主要的子系统构成:
1.类加载器子系统
2.运行时数据区(内存)
3.执行引擎
?
?
JVM原理
JVM是java的核心和基础 , 在java编译器和os平台之间的虚拟处理器 。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序 。
java编译器只需面向JVM,生成JVM能理解的代码或字节码文件 。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码 , 通过特定平台运行 。
JVM执行程序的过程 :
I.加载.class文件
II.管理并分配内存
III.执行垃圾收集
JRE(java运行时环境)包含JVM的java程序的运行环境
JVM是Java程序运行的容器,但是他同时也是操作系统的一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间 。
JVM在整个jdk中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也叫虚拟计算机.操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境 。
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂接到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类 。
寄存器
所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组 。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度 。然而,如果虚拟机中的寄存器比实际CPU的寄存器多,在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器 , 这反而会降低虚拟机的效率 。针对这种情况,JVM只设置了4个最为常用的寄存器 。它们是:
pc程序计数器
optop操作数栈顶指针
frame当前执行环境指针
vars指向当前执行环境中第一个局部变量的指针
所有寄存器均为32位 。pc用于记录程序的执行 。optop,frame和vars用于记录指向Java栈区的指针 。寄存器
栈结构
作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法 。当JVM得到一个Java字节码应用程序后 , 便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息 。每个栈框架包括以下三类信息:
局部变量
执行环境
操作数栈
局部变量用于存储一个类的方法中所用到的局部变量 。vars寄存器指向该变量表中的第一个局部变量 。
执行环境用于保存解释器对Java字节码进行解释过程中所需的信息 。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针 。执行环境是一个执行一个方法的控制中心 。例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈 , 从栈顶弹出两个整数进行加法运算 , 最后将结果压入栈顶 。
操作数栈用于存储运算所需操作数及运算的结果 。
运行数据
JVM定义了若干个程序执行期间使用的数据区域 。这个区域里的一些数据在JVM启动的时候创建 , 在JVM退出的时候销毁 。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁 。分别有程序计数器 , 堆,栈,方法区,运行时常量池 。
运行过程
上面对虚拟机的各个部分进行了比较详细的说明,下面通过一个具体的例子来分析它的运行过程 。
推荐阅读
- 联想电脑显卡怎么驱动,联想电脑显卡驱动怎么更新
- 拍摄月全食需要什么设备,月食拍摄技巧
- 全网营销如何经营企业营销,全网营销如何经营企业营销模式
- 医疗直播背景素材高级,医疗直播都有哪些内容
- 代码解耦java 代码解耦 英文
- 佳能拍摄视频什么好,佳能拍视频哪款好
- python获取京东评论,python爬取京东评论
- asp.net取日期部分,asp获取当前日期和时间
- c语言字符长度统计函数 c语言统计字符串的长度