一、阐述
java 虚拟机(JVM)是一台执行java 字节码的虚拟计算机,拥有独立的运行机制,其运行的java字节码也未必由Java 语言编译而成。JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、垃圾回收器、即时编译器。
二、作用
Java 虚拟机是二进制自己码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细的定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点:
一次编译,处处运行
自动内存管理
自动垃圾回收功能
三、JVM整体结构
HotSpot VM 是目前高性能虚拟机的代表之一,采用解释器与即时编译器并存的架构。
四、Java代码执行流程
Java 源码(.java 文件)经过Java编译器编译后(编译器编译过程为:词法分析、语法分析、语法/抽象语法树、语义分析、字节码生成器等步骤)生成字节码文件(.class 文件)。
JVM将每一条要执行的字节码通过类加载器(ClassLoader)加载到内存中,再通过字节码校验器的校验,Java解释器翻译成对应的机器码,其中对于热点代码使用即时编译器(JIT)编译执行,最后在操作系统解释运行。
五、JVM的架构模型
Java编译器输入的指令集架构分两种,一种是基于栈的指令集架构,一种是基于寄存器的指令集架构。
两种结构的特点:
.基于栈式架构的特点
1、设计和实现更加简单,适用于资源受限的系统;
2、避开了寄存器的分配难题:使用零地址指令方式分配。
3、指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。
4、不需要硬件支持,可移植性更好,更方便实现跨平台。
.基于寄存器架构的特点
1、典型的应用是x86的二进制指令集:如传统的PC以及Android的Davlik虚拟机。
2、指令集架构则完全依赖硬件,可移植性差。
3、性能优秀,执行效率高。
4、花费更少的指令去完成一项操作。
5、通常情况下,基于寄存器架构的指令集往往都是以一地址指令、二地址指令和三地址指令为主。而基于栈式架构的指令集却是以零地址指令为主。
.总结
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的架构。基于栈式架构有点是跨平台,指令集小,编译容易实现,缺点是性能下降,实现相同的功能需要更多的指令。
tips:idea查看字节码文件命令,进入字节码文件所在的目录执行 javap -v xxx.class
六、JVM的生命周期
.JVM启动
Java虚拟机的启动是通过引导类加载器创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
.JVM的执行
1.虚拟机运行的任务就是执行java程序。
2.程序开始执行时,jvm也一同运行,程序执行结束,jvm就停止运行。
3.执行一个Java程序时,本质上执行的是Java虚拟机的进程。
.JVM的退出
jvm退出的几种情况:
1、程序正常执行结束。
2、程序在执行过程中遇到异常或错误导致异常终止。
3、由于操作系统出现错误导致Java虚拟机进程终止。
4、调用Runtime类或者System类的exit方法,或者Runtime类的halt方法。
5、JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,jvm也会退出。