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)
    例如:
  • j1900 bios 开启 虚机 化 j1900虚拟机_Java

  • 一些特殊的方法
    <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>]