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(JIT,就是即时编译器,可以根据字节码的使用频率对常用的字节码生成本地机器指令(运行时),并且保存下来,以便于下次使用,感觉有点缓存的味道,目的是加快运行速度,减少JAVA不停的解释引起的速度慢问题) - 1997年 JDK1.1 发布
-AWT、内部类、JDBC、RMI、反射 - 1998年 JDK1.2 Solaris Exact VM
-JIT解释器混合
-Accurate Memory Management 精确内存管理,数据类型敏感
-提升了GC性能 - 2000年 JDK1.3 Hotspot 作为默认虚拟机发布
- 2002年 JDK1.4 Classic VM退出历史舞台
- 2004年发布 JDK1.5即JDK5、J2SE 5、Java 5 具有革命性意义
-泛型
-注解
-装箱
-枚举
-可变长的参数
-Foreach循环
(颠覆了传统的写法) - JDK1.6 JDK6
-脚本语言支持
-JDBC 4.0
-Java编译器 API - 2011年JDK7发布
-延误项目推出到JDK8
-增加了一款全新的GC收集器:G1
-动态语言增强
-64位系统中的压缩指针
-NIO2.0 - 2014年JDK8发布
-Lambda表达式
-语法增强 - 2016年JDK9
-模块化
各式JVM
- KVM
-SUN发布
-IOS Android前,广泛用于手机系统 - CDC/CLDC HotSpot
-手机、电子书、PDA等设备上建立统一的Java编程接口
-J2ME的重要组成部分 - JRockit
-BEA - IBM J9 VM
-IBM内部 - Apache Harmony
-兼容于JDK 1.5和JDK 1.6的Java程序运行平台
-与Oracle关系恶劣,退出JCP,Java社区的分裂
-OpenJDK出现后,受到挑战 2011年退役
-没有大规模商用经历
-对Android的发展有积极作用
规范
- Java语言规范(略)
-语法
-变量
-类型
-文法 - JVM规范
-Class文件类型
-运行时数据
-帧栈
-虚拟机的启动
-虚拟机的指令集
Java语言和JVM相对独立
JVM规范
- 整数的表达
-原码:第一位为符号位(0为正数,1为负数)
-反码:符号位不动,原码取反
-负数补码:符号位不动,反码加1
-正数补码:和原码相同
-打印整数的二进制表示
int a = -6;
for(int = 0;i < 32;i++){
int t=(a & 0x80000000>>>i)>>>(31-i);
System.out.print(t);
}
例如:
-6
原码:10000110
反码:11111001
补码:11111010
-1
原码:10000001
反码:11111110
补码:11111111
- Float的表示与定义
-支持IEEE 754
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
(指数:8 尾数:23)
e全为0 尾数附加位为0 否则尾数附加位为1
sm2^(e-127)
例如: - 一些特殊的方法
<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>]