深入JVM内核---原理,诊断与优化
JVM的概念
JAM是Java Virtual Machine的简称。意为Java虚拟机
虚拟机
指通过软件模拟的具有完整硬件系统功能的,运行在一种完整隔离环境中的完整计算机系统
有哪些虚拟机
- VMWare
-Visual Box
-JVM
VMWare或者Visual Box都是使用软件模拟物理CPU的指令集
JVM使用软件模拟Java字节码的指令集
JVM发展史
初始JVM-Java和JVM的历史
1996年SUN JDK1.0Classic VM
-纯解释运行,使用外挂进行JIT
1997年JDK1.1发布
-AWT, 内部类,JDBC,RMI,反射
1998年 JDK1.2 Solaris Exact VM
-JIT 解释器混合
-Accurate Memory Management 精确内存管理,数据类型敏感(JDK1.2后 称为Java 2 J2SE J2EE J2ME的出现加入Swing Collections)
-提升的GC性能
2000年 JDK 1.3 Hotspot 作为默认虚拟机发布 加入JavaSound
2002年 JDK1.4Classic VM退出历史舞台 Assert正则表达式 NIO IPV6 日志API 加密类库等
2004年发布 JDK1.5 即 JDK5,J2SE 5 ,Java 5
-泛型
-注释
-装箱
-枚举
JDK1.6 JDK6
-脚本语言支持
-JDBC4.0
-Java编译器 API
-可变长的参数
-Foreach循环
JDK1.6 JDK6
-脚本语言支持
-JDBC 4.0
-Java编译器API
2011年 JDK7发布
-延误项目推出到JDK8
-G1
-动态语言增强
-64位系统中的压缩指针
-NIO 2.0
2014年 JDK8发布
-Lambda表达式
-语法增强 Java类型注释
2016年JDK9
-模块化
大事记
使用最为广泛的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优秀特性
JVM种类
KVM
-Sun发布
IOS Android前,广泛用于手机系统
CDC/CLDC HotSpot
-手机,电子书,PDA等设备上建立统一的Java编程接口
-J2ME的重要组成部分
-BEA
IBM J9 VM
-IBM内部
Apache Harmony
-兼容于1.5和JDK1.6的Java程序运行平台
-与Oracle关系恶劣 退出JCP,Java社区的分裂
-OpenJDK出现后,受到挑战2011年退役
-没有大规模商用经历
对Android的发展有积极的作用
JRockit
Java语言规范
-语法
语法定义
-IfThenStatement
if(Expression)Statement
-ArgumentList;
Argument
ArgumetList,Argument
1.词法结构
- \u+4个进制数字,表示UTF-16
-行终结符:CR,or LF,or CR LF。
Identifier: IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral IdentifierChars: JavaLetter IdentifierChars JavaLetterOrDigit JavaLetter: any Unicode chatacter that is a Java letter(see below) JavaLetterOrDigit: any Unicode chatacter that is a Java letter-or-digit(see below)
-变量
-Int
. 0 2 0372 0xDada_Cafe 1996 0x00_FF_00_FF
-Long
.0I 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
-类型
Java内存模型
类加载连接的过程
public static final abstract的定义
异常
数组的使用
-文法
JVM规范
-Class文件类型
-运行时数据
-帧栈
-虚拟机的启动
虚拟机的指令集
-泛型
-空白符
.空格tab\t换页\f行终结符
-注释
-标示符
-关键字
Java语言规范定义了什么是Java语言
Java语言和JVM相对独立
-Groovy
-Clojure
-Scala
JVM主要定义二进制class文件和JVM指令集等
Class文件格式
数字的内部表示和储存
-Byte -128 to 127(-2的7次方 to 2的7次方-1)
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 eeeeeee mmmmmmmmmmmmmmmmmmmmmmm
指数:8 尾数:23
.e全0 尾数附加为0 否则尾数附加位为1
.s*m*2^(e-127)
一些特殊的方法
-<clinit>
-<init>