虚拟机
- 所谓虚拟机,就是一台虚拟的计算机,它是一款软件,用来执行一系列虚拟计算机指令,大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
-
系统虚拟机
大名鼎鼎的Visual Box,VMware就属于系统虚拟机,他们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
-
程序虚拟机
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称之为Java字节码指令。
- 无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
Java虚拟机
- Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成
- JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器
- Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在Java虚拟机内部。
Java虚拟机就是二进制字节码的运行环境,负责装在字节码到其内部,解释编译为对应平台的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点:
- 一次编译到处运行
- 自动内存管理
- 自动垃圾回收功能
jvm的位置:
JVM是运行在操作系统之上的它与硬件没有直接交互
JVM的整体结构
类加载子系统:通过加载,链接,初始化将字节码文件加载到内存中,生成一个class对象
数据经过类装载器子系统在方法区生成class实例
Java栈又称虚拟机栈
在内存当中,多线程共享方法区和堆
虚拟机栈,本地方法栈,程序计数器,每个线程独享一份
执行引擎:
- 把字节码文件加载到内存中解释运行时,用到的就是解释器
- 执行引擎负责把高级语言翻译成机器语言
- 垃圾回收器,实现垃圾的自动回收
Java代码执行流程:
其中执行引擎位于:
- 解释器:保证响应时间,对字节码指令逐行解释执行
- JIT编译器:字节码指令中有一些指令是要反复执行的,我们称之为热点代码,JIT编译器可以将热点代码再次编译成机器指令并缓存起来放到方法区中,下次可以直接调用
- 所以JIT编译器主要负责程序执行的性能,主流的虚拟机都采用解释器、JIT编译器二者并存的方式
对于Java字节码的个人理解:
Java字节码是仅对java虚拟机有效的一套底层编码,是对各种类型cpu的一种上层抽象,故而叫一处编写处处执行。由于编译型的语言最终都是2进制代码,所以与汇编语言没什么区别
Java虚拟机属于程序虚拟机,虚拟了一台可以执行机器指令的计算机,Java字节码就是将这台计算机的汇编码
虚拟机可以识别java字节码,所谓字节码就是以字节为基本单位的机器指令。而java语言是以语句为单位的指令。java虚拟机执行的字节码不一定是java语言编译的,其它任意语言都可以,只要写一个编译器就行
对于执行引擎的理解:
所有的编译器,都是编译成机器指令,没有编译成汇编指令的。jvm是使用c写的,jvm字节码在虚拟机中执行时,再调用操作系统底层函数,这些操作系统函数大多是c写好的,是操作系统厂商编写的操作系统对外开放的函数,jvm在执行class字节码时,调用操作系统函数就可以。
疑惑:虽然都是C语言写的,但是如果是不一样的操作系统,需要调用的操作系统函数仍然各不相同,比如如果想调用Windows的系统函数,首先就需要打开windows.h头文件,然而Linux就不需要,二者创建线程所使用的方法就不相同。
解答:类加载器子系统将Java字节码文件加载到内存,执行引擎根据字节码调用操作系统的API函数,每种操作系统都有不同的jdk版本。