JVM(Java Virtual Machine)即java虚拟机,是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成,其他的程序语言只要能符合JVM规范那么就可以在虚拟机上运行。
JVM主要分为五大模块:类装载器子系统、运行时数据区、执行引擎、本地方法接口和垃圾收集模块。
JVM特点:①一次编译,到处运行。②自动内存管理。③自动垃圾回收功能。
JVM作用:负责装载字节码到内部,解释编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义。
JVM位置:
接下来,主要以HotSpot VM作为例子介绍JVM:
HotSpot是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
它采用解释器与即时编译器并存的架构。
什么是解释器:是一种能够把高级编程语言一行一行直接转译运行的程序。
什么是即时编译器:是一个把Java的字节码转换成可以直接发送给处理器的指令的程序。
整体结构:
Java编译器输出的指令流,基本上是一种基于栈的指令集架构,它们依赖操作数栈进行工作,与之相对的另外一套常用的指令集架构是基于寄存器的指令集。
基于栈的指令集架构特点:
(1)设计和实现更简单,适用于资源受限的系统
(2)避开了寄存器分配难题,使用零地址指令分配
(3)指令流中指令大部分是零地址指令,其执行过程依赖于操作栈
(4)指令集更小,编译器容易实现
(5)不需要硬件支持,跨平台性好,可移植性好
基于寄存器的指令集架构特点:
(1)指令集架构完全依赖于硬件,可移植性差
(2)性能优秀,执行效率高
(3)在大部分的情况下,该指令集往往以一地址指令、二地址指令和三地址指令为主
总结:虽然基于寄存器的指令集架构性能优秀,执行效率高,但考虑到其跨平台性与可移植性差,我们还是选用基于栈的指令集架构。
JVM生命周期:
启动:通过引导类加载器创建一个初始类启动Java虚拟机。
执行:执行Java程序。
退出:
(1)程序正常执行结束
(2)程序发发生了异常或错误而终止
(3)操作系统出现错误而终止
(4)通过调用exit()或halt()方法退出
(5)JNI规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。