深入JVM内核1 初识JVM

深入JVM内核 目录

1 JVM概念

JVM是Java Virtual Machine的简称。意味Java虚拟机
虚拟机

  • 指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
    有哪些虚拟机
  • VMWare
  • Visual Box
  • JVM
    VMWare或者Visual Box都是使用软件模拟物理CPU的指令集
    JVM使用软件模拟Java 字节码的指令集

2 初识JVM-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 作为默认虚拟机发布
2002年 JDK 1.4 Classic VM退出历史舞台
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 规范

4.1 Java语言规范
  • 语法
  • 变量
  • 类型
  • 文法

4.1.1 Java语言规范

  • 语法定义
IfThenStatement
if(Expression)Statement  :  if(true){do sth;}
ArgumentList;
Argument
ArgumentList , Argument  
  • 词法结构
\u + 4个16进制数字 表示UTF-16
行终结符: CR, or LF, or CR LF.
空白符
空格 tab \t 换页 \f  行终结符
注释
Identifier:    IdentifierChars but not a Keyword or BooleanLiteral or NullLiteralIdentifierChars:    JavaLetter    IdentifierChars JavaLetterOrDigitJavaLetter:    any Unicode character that is a Java letter (see below)JavaLetterOrDigit:    any Unicode character that is a Java letter-or-digit (see below)
Int
0 2 0372 0xDada_Cafe 1996 0x00_FF__00_FF 允许下划线表示int 类型
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
操作
+=  -=  *=  /=  &=  |=  ^=  %=  <<=  >>=  >>>=
  • 类型和变量
元类型 
byte short int long float char

变量初始值
boolean false
char \u0000
泛型
4.2 JVM规范
  • Class 文件格式
  • 数字的内部表示和存储
Byte  -128 to 127 (-27 to 27 - 1)
  • returnAddress 数据类型定义
指向操作码的指针。不对应Java数据类型,不能在运行时修改。Finally实现需要
  • 定义PC
  • 方法区

4.2.1整数的表达

原码:第一位为符号位(0为正数,1为负数)
反码:符号位不动,原码取反
负数补码:符号位不动,反码加1
正数补码:和原码相同
打印整数的二进制表示
int a=-6;
for(int i=0;i<32;i++){
    int t=(a & 0x80000000>>>i)>>>(31-i);
    System.out.print(t);
}

4.2.2 Float的表示与定义

支持 IEEE 754

  • s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
  • e全0 尾数附加位为0 否则尾数附加位为1
  • sm2^(e-127)
-5
11000000101000000000000000000000
-1*2^(129-127)*(2^0+2^-2)

4.2.3 一些特殊的方法

4.3 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反汇编的格式
  [  [ ... ]] []

java程序

  void spin() {
  int i; 
  for (i = 0; i < 100; i++) { ;
     // Loop body is empty
   }
 } 

JVM指令

0   iconst_0       // Push int constant 0
1   istore_1       // Store into local variable 1 (i=0)
2   goto 8         // First time through don't increment
5   iinc 1 1       // Increment local variable 1 by 1 (i++)
8   iload_1        // Push local variable 1 (i)
9   bipush 100     // Push int constant 100
11  if_icmplt 5    // Compare and loop if less than (i < 100)
14  return         // Return void when done
特别感谢

深入JVM内核—原理、诊断与优化

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