JVM概述
一、高级语言与计算器
1.1 计算器
计算器是近代人发明的可以进行数字运算的机器。
1.2 机器指令
机器指令(Machine Instructions)是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。
1.3 汇编语言
汇编语言是直接在硬件之上工作的编程语言,是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的,不同平台之间不可直接移植。亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。使用编译器,可以把汇编程序转译成机器指令程序
1.4 高级语言
高级语言(High-level programming language)是一种独立于机器,面向过程或对象的语言。高级语言是参照数学语言而设计的近似于日常会话的语言。
高级语言与计算机的硬件结构及指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好的描述各种算法,而且容易学习掌握。但高级语言编译生成的程序代码一般比用汇编程序语言设计的程序代码要长,执行的速度也慢。所以汇编语言适合编写一些对速度和代码长度要求高的程序和直接控制硬件的程序。
高级语言、汇编语言和机器语言都是用于编写计算机程序的语言。
二、Java与JVM
2.1 Java特性
2.1.1 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念;
2.1.2 Java是一门跨平台语言。java通过编译形成class文件,再通过不同平台的jvm虚拟机,传递指令到cpu,从而实现跨平台;
2.1.3 Java提供了对内存的自动管理,程序员无需在程序中进行分配、释放内存;
2.2 JVM简介
2.2.1 JVM 是Java虚拟机,是用来执行字节码文件(二进制的形式)的虚拟计算机。
2.2.2 JVM也是跨语言的平台。JVM是跨语言的平台,很多语言都可以编译成为遵守规范的字节码,这些字节码都可以在Java虚拟机上运行。Java虚拟机不关心这个字节码是不是来自于Java程序,只需要各个语言提供自己的编译器,字节码遵循字节码规范,比如字节码的开头是CAFEBABY。
2.2.3 JVM也是一台虚拟机,虚拟机就是一台虚拟的计算机。JVM是在操作系统之上,与硬件没有直接交互。
2.3 JVM发展历史
2.3.1 sun Classic VM :世界第一款商用Java虚拟机,JDK1.4时被淘汰;
2.3.2 Exact :具有现代高性能虚拟机的雏形;
2.3.3 hotspot:虚拟机 JDK1.3时,HotSpot VM成为默认虚拟机;
2.3.4 JRockit :专注服务器端应用,全部代码靠即时编译器编译后执行;
2.3.5 TaobaoJVM:基于OpenJDK开发了自己的定制版本AlibabaJDK;
2.3.6 IBM J9:市场定位与HotSpot接近,服务器端、桌面应用,嵌入式等多用途VM;
2.3.7 Grall VM:跨语言全栈虚拟机,可以作为任何语言的运行平台使用。
三、JVM架构模型
Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构;
3.1 基于栈的指令集架构
3.1.1 设计和实现更简单,适用于资源受限的系统;
3.1.2 避开了寄存器分配的难题:使用零地址指令方式分配;
3.1.3 指令流中的指令大部分是零地址指令,其执行过程过渡依赖于操作栈。指令集更小,编译器更容易实现;
3.1.4 不需要硬件支持,可移植性更好,更好实现跨平台;
3.2 基于寄存器的指令集架构
3.2.1 典型的应用是X86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机;
3.2.2 指令集架构完全依赖硬件,可移植性更差;
3.2.3 性能优秀和执行更高效;
3.2.4 花费更少的指令去完成操作;
3.2.5 大部分情况下,基于寄存器架构的指令集架构往往都是以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集确是以零地址指令为主。
四、JVM生命周期
4.1 虚拟机的启动
Java虚拟机的启动是通过引导类加载器创建一个初始类来完成的,这个类是由虚拟机的具体实现指定的。
4.2 虚拟机的执行
一个运行中的Java虚拟机有一个清晰的任务:执行Java程序;执行一个Java程序的时候,真正执行的是一个叫做Java虚拟机的进程。
4.3 虚拟机的退出
4.3.1 程序正常执行结束退出;
4.3.2 程序执行过程中遇到异常或错误而异常退出;
4.3.3 由于操作系统出现错误导致java虚拟机线程终止;
4.3.4 线程调用RunTime类或者System类的exit方法、或者Runtime类halt方法;
五、Java代码的执行流程
六、JVM的整体架构
HotSpot VM是目前市面上高性能虚拟机的代表作之一;
它采用解释器与即时编译器并存的架构;
在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。
七、补充
7.1 编译执行
由编译程序将目标代码一次性编译成目标程序,再由机器运行目标程序。
7.2 解释执行
将源语言直接作为源程序输入,解释执行解释一句后就提交计算机执行一句,并不形成目标程序。
7.3 编译执行和解释执行的区别
7.3.1 优势不同
编译执行:相比解释执行编译执行效率高,占用资源小,适合复杂程序;
解释执行:开发速度快,出现严重BUG的几率小。
7.3.2 缺点不同
编译执行:兼容性差,例如在windows平台上写的编译程序一般不可以在unix平台上运行;
解释执行:解析需要时间,不生成目标程序而是一句一句的执行的方式会造成计算机资源的浪费,即执行效率低。