深入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内核—原理、诊断与优化