初识JVM
- JVM的概念
- JVM发展历史
- JVM种类
- Java语言规范
- JVM规范
JVM是Java Virtual Machine的简称。意为Java虚拟机
虚拟机
指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
有哪些虚拟机
VMWare
Visual Box
JVM
VMWare或者Visual Box都是使用软件模拟物理CPU的指令集
JVM使用软件模拟Java 字节码的指令集
Java和JVM的历史
- 1996年 SUN JDK 1.0 Classic VM
纯解释运行,使用外挂进行JIT - 1997年 JDK1.1 发布
AWT、内部类、JDBC、RMI、反射 - 1998年 JDK1.2 Solaris Exact VM
JIT 解释器混合
Accurate Memory Management 精确内存管理,数据类型敏感
提升的GC性能 - 2000年 JDK 1.3 Hotspot 作为默认虚拟机发布
加入JavaSound - 2002年 JDK 1.4 Classic VM退出历史舞台
Assert 正则表达式 NIO IPV6 日志API 加密类库 - 2004年发布 JDK1.5 即 JDK5 、J2SE 5 、Java 5
泛型
注解
装箱
枚举
可变长的参数
Foreach循环 - JDK1.6 JDK6
脚本语言支持
JDBC 4.0
Java编译器 API - 2011年 JDK7发布
延误项目推出到JDK8
G1
动态语言增强
64位系统中的压缩指针
NIO 2.0 - 2014年 JDK8发布
Lambda表达式
语法增强 Java类型注解 - 2016年JDK9
模块化
说明:JDK1.2开始 称为Java 2
J2SE J2EE J2ME 的出现
加入Swing Collections
Java和JVM的历史 – 大事记
- 使用最为广泛的JVM为HotSpot
- HotSpot 为Longview Technologies开发 被SUN收购
- 2006年 Java开源 并建立OpenJDK
- HotSpot 成为Sun JDK和OpenJDK中所带的虚拟机
- 2008 年 Oracle收购BEA
- 得到JRockit VM
- 2010年Oracle 收购 Sun
- 得到Hotspot
- Oracle宣布在JDK8时整合JRockit和Hotspot,优势互补
- 在Hotspot基础上,移植JRockit优秀特性
各式JVM
- KVM
- SUN发布
- IOS Android前,广泛用于手机系统
- CDC/CLDC HotSpot
- 手机、电子书、PDA等设备上建立统一的Java编程接口
- J2ME的重要组成部分
- JRockit
- BEA
- BM J9 VM
- IBM内部
- Apache Harmony
- 兼容于JDK 1.5和JDK 1.6的Java程序运行平台
- 与Oracle关系恶劣 退出JCP ,Java社区的分裂
- OpenJDK出现后,受到挑战 2011年 退役
- 没有大规模商用经历
- 对Android的发展有积极作用
规范
-
Java语言规范
- 语法
- 变量
- 类型
- 文法
-
JVM规范
- Class文件类型
- 运行时数据
- 帧栈
- 虚拟机的启动
- 虚拟机的指令集
-
词法结构
- Int
- 0 2 0372 0xDada_Cafe 1996 0x00_FF__00_FF
- Long
- 0l 0777L 0x100000000L 2_147_483_648L 0xC0B0L
- Float
- 1e1f 2.f .3f 0f 3.14f 6.022137e+23f
- Double
- 1e1 2. .3 0.0 3.14 1e-9d 1e137
- 操作
- += -= *= /= &= |= ^= %= <<= >>= >>>=
- Int
-
类型和变量
-
元类型
- byte short int long float char
-
变量初始值
- boolean false
- char \u0000
-
泛型
-
Java语言规范
-
Java内存模型
-
类加载链接的过程
-
public static final abstract的定义
-
异常
-
数组的使用
-
…….
-
Java语言规范定义了什么是Java语言
-
Java语言和JVM相对独立
- Groovy
- Clojure
- Scala
-
JVM主要定义二进制class文件和JVM指令集等
-
Class 文件格式
-
数字的内部表示和存储
- Byte -128 to 127 (-27 to 27 - 1)
-
returnAddress 数据类型定义
- 指向操作码的指针。不对应Java数据类型,不能在运行时修改。Finally实现需要
-
定义PC
-
堆
-
栈
-
方法区
-
整数的表达
- 原码:第一位为符号位(0为正数,1为负数)
- 反码:符号位不动,原码取反
- 负数补码:符号位不动,反码加1
- 正数补码:和原码相同
- 打印整数的二进制表示
int a=-6;
for(int i=0;i<32;i++){
int t=(a & 0x80000000>>>i)>>>(31-i);
System.out.print(t);
}
- VM指令集
- 类型转化
- l2i
- 出栈入栈操作
- aload astore
- 运算
- iadd isub
- 流程控制
- ifeq ifne
- 函数调用
- invokevirtual invokeinterface invokespecial invokestatic
- 类型转化
- JVM需要对Java Library 提供以下支持:
- 反射 java.lang.reflect
- ClassLoader
- 初始化class和interface
- 安全相关 java.security
- 多线程
- 弱引用
- JVM的编译
- 源码到JVM指令的对应格式
- Javap
- JVM反汇编的格式
- [ [ … ]] []