深入JVM内核原理-1.初识JVM
2019-07-18 本文已影响0人
笨鸡
1.JVM的概念
- JVM是Java Virtual Machine的简称。意为Java虚拟机
- 虚拟机
指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
- 有哪些虚拟机
- VMWare
- Virtual box
- JVM
- VMWare或者Virtual box都是使用软件模拟物理CPU的指令集
- JVM使用软件模拟Java字节码的指令集
2.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的性能
- JDK1.2开始 称为Java2 J2SE J2EE J2ME的出现加入Swing Collections
- 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
- 模块化
3.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优秀特性
4.各式JVM
- KVM
- SUN发布
- IOS Android前,广泛用于手机系统
- CDC/CLDC HotSpot
- 手机、电子书、PDA等设备上建立统一的Java编程接口
- J2ME的重要组成部分
- JRockit
- BEA
- IBM J9 VM
- IBM内部
- Apache Harmony
- 兼容于JDK1.5和JDK1.6的Java程序运行平台
- 与Oracle关系恶劣 退出JCP,Java社区分裂
- OpenJDK出现后,受到挑战2011年退役
- 没有大规模商用经历
- 对Android的发展有积极作用
5.规范
- Java语言规范
- 语法
- 变量
- 类型
- 文法
- JVM规范
- Class文件类型
- 运行时数据
- 帧栈
- 虚拟机的启动
- 虚拟机的指令集
6.Java语言规范
- 语法定义
- IfThenStatement:if(Expression) Statement
- ArgumentList: Argument ArgumentList,Argument
- 词法结构
- \u + 4个16进制数字 表示UTF-16
- 行终结符:CR,or LF,or CR LF.
- 空白符 空格 tab \t 换页 \f 行终结符
- 注释
- 标示符
- 关键字
- 此法结构
- Int
- 0 2 0372 0xDada_Cafe 1996 0x00_FF_00_FF
- Long
- 0L 0777L 0x1000000000L 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 double boolean char
- 变量初始值
- boolean true
- char \u0000
- 泛型
- 元类型
- Java内存模型
- 类加载链接的过程
- public static final abstract的定义
- 异常
- 数组的使用
- ......
7.JVM规范
- Java语言规范定义了什么是Java语言
- Java语言和JVM相对独立
- Groovy
- Clojure
- Scala
- JVM主要定义二进制class文件和JVM指令集等
- Class文件格式
- 数字的内部表示和存储
- Byte -128 to 127
- 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);
}
- Float的表示与定义
- 支持IEEE 754
- s 8个e 23个m
- e全0 尾数附加位为0 否则尾数附加位为1
- sm2^(e-127)
- 支持IEEE 754
- 一些特殊的方法
- <clinit>
- <init>
- 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反汇编的格式
- <index> <opcode> [ <operand1> [ <operand2>...]] [<comment>]