目录
1. JVM的初步介绍
1.1 JDK,JRE,JVM的关系
1.2 JVM的整体结构
1.3 Java代码执行流程
1.4 JVM的架构模型
1.5 JVM的生命周期
1. JVM的初步介绍
1.1 JDK,JRE,JVM的关系
JVM虚拟机是运行在操作系统之上的,它与硬件没有直接的交互,同时JDK>JRE>JVM JDK中包含有java Language前端编译器(例如:javac),可以将.java的文件编译成.class的字节码文件 JRE包含了JVM和一系列的Java SE的API,而JVM可以解释运行.class的字节码文件
1.2 JVM的整体结构
·HotSpot VM是目前市面上高性能虚拟机的代表着之一
·它采用解释器与即时编译器并存的架构
·在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步
1.3 Java代码执行流程
java源码(xxx.java)通过java编译器(词法分析->语法分析->语义分析->字节码生成器)生成字节码文件(xxx.class) 然后将字节码文件传到Java虚拟机中(类加载器->字节码校验器->解释执行(翻译)和JIT编译器编译执行) 最后将编译执行的结果传到操作系统之中
1.4 JVM的架构模型
Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构 ·基于栈式架构的特点(HotSpot)
>设计和实现更简单,适用于资源受限的系统
>避开了寄存器的分配难题:使用零地址指令方式分配
>指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器更容易实现
>不需要硬件支持,可移植性更好,更好实现跨平台
·基于寄存器架构的特点
>典型的应用是x86的二进制指令集:比如传统的pc以及Android的Davlik虚拟机
>指令集架构则完全依赖硬件,可移植性差
>性能优秀和执行更高效 >花费更少的指令去完成一项操作
>在大部分情况下,基于寄存器的指令集往往都以一地址指令,二地址指令和三地址指令为主
·举例 (编写java代码 )
public class StackStruTest{
public static void main(String[] args){
int i = 2;
int j = 3;
int k = i+j;
}
}
对上述代码进行编译后得到StackStruTest.class字节码文件,在终端反编译字节码文件,命令如下
cd + 字节码文件路径 javap -v StackStruTest
得到字节码指令(对应栈的架构)
Code: stack=2,locals=4,args_size=1 0: iconst_2 //生成常量2 1: istore_1 //将常量2保存在内存istore_1中 2: iconst_3 //生成常量3 3: istore_2 //将常量3保存在内存istore_2中 4: iload_1 //加载内存istore_1 5: iload_2 //加载内存istore_2 6: iadd //对内存1和内存2中的数据求和 7: istore_3 //将求和结果存放在内存istore_3中 8: return //返回结果
寄存器的计算流程(对应寄存器的架构)
mov eax,2 //将eax寄存器的值设为2 add eax,3 //使eax寄存器的值加3
1.5 JVM的生命周期
·虚拟机的启动:
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟 机的具体实现指定的
·虚拟机的执行:
>一个运行的Java虚拟机有着一个清晰的任务:执行Java程序
>程序开始执行时他才运行,程序结束时他就停止
>执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程
|·虚拟机的退出:
>程序正常执行结束
>程序执行过程中遇到了异常或错误而异常终止
>由于操作系统出现错误而导致Java虚拟机进程终止
>某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit和halt
>除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机退出



