虚拟机就是一台虚拟的计算机,分为:
系统虚拟机:Visula Box,VMware
程序虚拟机: JVM
在JVM上执行的指令称为java字节码指令.
java技术的核⼼就是java虚拟机(JVM,Java Virtual Machine),因为所有的java程序都运⾏在java
虚拟机内部。
优势
跨平台性、优秀的垃圾回收器,以及可靠的即时编译器。
作⽤
java虚拟机就是⼆进制字节码的运⾏环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执⾏。每⼀条java指令,java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果存储在哪⾥。
特点
- ⼀次编译,到处运⾏
- ⾃动内存管理(内存分配)
- ⾃动垃圾回收功能(内存回收)
JVM的位置
JVM是运行在操作系统之上的,与硬件没有直接的交互。
一次编译,到处运行
跨平台
随着java7的正式发布,java虚拟机的设计者们通过JSR-292规范基本实现:在java虚拟机平台上运⾏⾮java语⾔编写的程序。
java虚拟机根本不关⼼运⾏在其内部的程序是使⽤何种编程语⾔编写的,它只关⼼“字节码”⽂件。也就是java虚拟机拥有语⾔⽆关性,并不会单纯地与java语⾔“终身绑定”,只要其他编程语⾔的编译结果满⾜并包含java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是⼀个有效的字节码⽂件,就能被虚拟机所识别并装载运⾏。"java虚拟机"正在向"多语言虚拟机"方向发展
字节码
是⼀种中间状态(中间码)的⼆进制代码(⽂件),需要直译器转译后才能成为机器码
javac:命令将其编程成字节码⽂件
java:命令来执⾏class字节码⽂件
javap:是将字节码进⾏反编译(与javac对应),可以查看java编译器为我们⽣成的字节码。
我们平时说的java字节码指的是⽤java语⾔编译成的字节码。准确的说任何能在jvm平台上执⾏的字节码格式都是⼀样的。所以应该统称为: jvm字节码。
不同的编译器,可以编译出相同的字节码⽂件,字节码⽂件也可以在不同的jvm上运⾏。 java虚拟机与java语⾔并没有必然的联系,它只与特地的⼆进制⽂件格式-class⽂件格式所关联,class⽂件中包含了java虚拟机指令集(或者称为字节码,Bytecodes)和符号表,还有⼀些其他辅助信息。
HotSpot VM
HotSpot 是较新的 JVM, ⽤来替代 JIT (Just in Time, 即时编译), 可以⼤⼤提⾼ Java 的运⾏性能, 即:
Java 起初是把源代码编译为 .class 格式的字节码在虚拟机上执⾏, 速度较慢;
HotSpot 将常⽤的部分代码编译为本地(native)代码, 显著提⾼了性能。
其他的VM: JRockit VM,IBM J9 VM,SUN Classic VM等等。
➜ ~ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)