深入JVM内核原理-1.初识JVM

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
    • 运算符
      • += -= *= /= &= |= ^= %= <<= >>= >>>=
  • 类型和变量
    • 元类型
      • 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)
  • 一些特殊的方法
  • 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反汇编的格式
      • [ [ ...]] []

你可能感兴趣的:(深入JVM内核原理-1.初识JVM)