深入JVM虚拟机(一) 初识JVM
来源:互联网 发布:淘宝自己举报自己 编辑:程序博客网 时间:2024/06/03 22:38
深入JVM虚拟机(一)初识JVM
1 JVM虚拟机简史
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
1.1 JVM发展
1、1996年SUN JDK1.0 Classic VM:
- 纯解释运行,使用外挂进行JIT
2、1997年 JDK1.1发布:
- AWT、内部类、JDBC、RMI、反射。
3、1998年 JDK1.2发布SolarisExact VM:
- JIT解释器混合。
- AccurateMemory Management精确内存管理,数据类型敏感。
- 提升GC性能。
- JDK1.2开始称为Java2 J2SE J2EE J2ME出现,加入SwingCollections。
4、2000年 JDK1.3 Hotspot 作为默认虚拟机发布:
- 加入JavaSound
5、2002年JDK1.4Classic VM退出历史舞台:
- Assert正则表达式 NIO IPV6日志加密类库。
6、2004年JDK1.5在Java语法易用性上做出了非常大的改进:
- 增加自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等语法特性。
7、2006年JDK1.6发布Sun终结了从JDK 1.2开始已经有8年历史的J2EE、J2SE、J2ME的命名方式:
- 提供动态语言支持(通过内置MozillaJavaScript Rhino引擎实现)。
- 提供编译API和微型HTTP服务器API。
8、2011年 JDK1.7发布,增加新特性:
- Java集合的增强支持,Switch中可用String类型参数,自动资源管理,提供新的G1收集器,加强对非Java语言的调用,升级类加载架构等。
9、2014年JDK1.8发布,Lambda表达式:
- 最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码。
- 语法增强 JAVA类型注解
1.2 JVM大事记
1、使用最为广泛的JVM为HotSpot
2、HotSpot为LongView Technologies开发被Sun收购
3、2006年 Java开源并建立OpenJDK
- HotSpot成为Sun JDK和OpenJDK中所带的虚拟机
4、2008年 Oracle收购BEA
- 得到JRockit VM
5、2010年Oracle收购Sun
- 得到HotSpot
6、Oracle宣布在JDK8时整合JRockit和HotSpot,优势互补
- 在Hotspot基础上,移植JRockit优秀特性
2 JAVA虚拟机规范
JVM遵循着冯·诺依曼体系结构的设计原理。冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操作码和地址码组成,操作码决定了操作类型和所操作的数的数字类型,地址码则指出地址码和操作数。而JVM通过在操作系统上建立虚拟机,自己定义出来的一套统一的数据结构和操作指令,把同一套语言翻译给各大主流的操作系统,实现了跨平台运行,可以说JVM是java的核心,是java可以一次编译到处运行的本质所在。
2.1 JAVA语言规范
1、语法定义:
语法定义
语法
IfThenStatement:
if (Expression) Statement
ArgumentList:
Argument
ArgumentList , Argument
if(true){do sth;}
add(a,b,c,d);
2、词法结构:
词法结构
词法说明
- \u + 4个16进制数字表示UTF-16
- 行终结符: CR, or LF, or CR LF.
- 空白符
- 空格 tab \t换页 \f 行终结符
- 注释
- 标示符
- 关键字
Identifier:
Identifier Chars but not a Keyword or Boolean Literal or Null Literal
标识符不能是一个关键字或者布尔值和null
IdentifierChars:
JavaLetter
IdentifierChars JavaLetter Or Digit
标识符可以是字母或者数字
JavaLetter:
any Unicode character that is a Java letter (see below)
任何的Unicode都可以做为标识符。
JavaLetterOrDigit:
any Unicode character that is a Java letter-or-digit (see below)
- Int
- Long
- Float
- Double
- 操作
0 2 0372 0xDada_Cafe 1996 0x00_FF__00_FF
0l 0777L 0x100000000L 2_147_483_648L 0xC0B0L
1e1f 2.f .3f 0f 3.14f 6.022137e+23f
1e1 2. .3 0.0 3.14 1e-9d 1e137
+= -= *= /= &= |= ^= %= <<= >>= >>>=
3、类型和变量
类型
语法
基本类型:
byte short int long float char
基本类型修改的是值。
引用类型修改的是引用。
2.2 整数的表达
1、原码:第一位为符号位(0为正数,1为负数),如整数5
十进制:5
二进制:00000101
2、反码:符号位不动,反码加1,如整数-6
十进制:-6
原码:10000110
反码:11111001
3、补码:正数补码:和原码相同,负数补码:符号位不动,反码加1,如整数06、-1、0
十进制:-6
原码:10000110
反码:11111001
补码:11111010
十进制:-1
原码:10000001
反码:11111110
补码:11111111
十进制:0
原码:10000000
反码:11111111
补码:00000000
4、使用补码加法计算,如-6-5:
十进制:-6+5=-1
11111010
+ 00000101
= 11111111
5、JAVA打印二进制
int num = -6; for (int i = 0; i < 32; i++) { int result = (num & 0x80000000 >>> i) >>> (31 - i); System.out.print(result); }
2.3 浮点型表达
1、Float支持IEEE754
2、特殊方法:
- <init>
- <clinit>
2.4 JVM的编译
- 源码到JVM指令的对应格式
- JVM反汇编的格式:<index> <opcode> [ <operand1> [ <operand2>... ]] [<comment>]
代码
指令代码
publicvoid spin() {
for (inti = 0;i < 100;i++) {
// zLoop body is empty
}
}
0 iconst_0 //把数据0入栈
1 istore_1 //把弹出来,赋给变量i(i=0)
2 goto 8 //通过不计算,直接跳转到第8指令
5 iinc 1 1 //本地变量i值加1操作 (i++)
8 iload_1 //把本地变量i推栈中
9 bipush 100 //把100推到栈中
11 if_icmplt 5 //比较i < 100是否小于100,如果小于100,跳转第5条指令
14 return //直接返回
2.5 学习JVM推荐书籍:
1. 《JVM7规范》
2. 《深入理解Java虚拟机》
3. 《HotSpot实战》
4. 《深入理解Java 7:核心技术与最佳实践》
5. 《java并发编程实践》
6. 《java多线程设计模式详解》
——厚积薄发(yuanxw)
- 深入JVM虚拟机(一) 初识JVM
- 深入理解jvm 虚拟机(一)
- 深入jvm虚拟机实战
- 深入理解JVM虚拟机
- 深入JVM虚拟机(二) JVM运行机制
- JVM一:Java虚拟机
- 深入了解Java虚拟机读书笔记(一)JVM内存区域
- 深入理解java虚拟机(一)----jvm内存模型
- 深入理解java虚拟机读书笔记(一): jvm的分类
- JVM虚拟机深入---线程安全
- 深入理解 Java 虚拟机-jvm
- 【JVM规范笔记一】JVM虚拟机结构
- 深入JVM一(走近JVM)
- 【深入JVM】JVM工具概述(一)
- Java虚拟机详解01----初识JVM
- JVM学习笔记之初识java虚拟机
- java 虚拟机系列文章1--初识JVM
- JVM学习(初识JVM)
- 15.4.5 简化元组的使用
- MongoDB 进阶模式设计
- 手写体识别
- linux下实现桥接联网
- POJ 2352 Stars(树状数组)
- 深入JVM虚拟机(一) 初识JVM
- android获取短信验证码并自动填写的实现一
- JAVA源码---String
- 更高效的Fibonacci求解
- css3 圆角框
- MVP模式探讨
- ACM 数论 A problem is easy
- Selenium - Working with SELECT elements
- 由《炮灰模型——女生选择追求者模型》到“微软钻石题”