深入JVM虚拟机(一) 初识JVM

 

 

深入JVM虚拟机()初识JVM

 

 

1 JVM虚拟机简史


JVMJava Virtual MachineJava虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。


1.1 JVM发展

深入JVM虚拟机(一) 初识JVM_第1张图片

 

1、1996SUN JDK1.0 Classic VM

-  纯解释运行,使用外挂进行JIT

 

2、1997 JDK1.1发布:

-  AWT、内部类、JDBCRMI、反射。

 

3、1998 JDK1.2发布SolarisExact VM

-  JIT解释器混合。

-  AccurateMemory Management精确内存管理,数据类型敏感。

-  提升GC性能。

-  JDK1.2开始称为Java2 J2SE J2EE J2ME出现,加入SwingCollections

 

4、2000 JDK1.3 Hotspot 作为默认虚拟机发布:

-  加入JavaSound

 

5、2002JDK1.4Classic VM退出历史舞台:

-  Assert正则表达式 NIO IPV6日志加密类库。

 

6、2004JDK1.5Java语法易用性上做出了非常大的改进:

-  增加自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等语法特性。

 

7、2006JDK1.6发布Sun终结了从JDK 1.2开始已经有8年历史的J2EEJ2SEJ2ME的命名方式:

-  提供动态语言支持(通过内置MozillaJavaScript Rhino引擎实现)。

-  提供编译API和微型HTTP服务器API

 

8、2011 JDK1.7发布,增加新特性:

-  Java集合的增强支持,Switch中可用String类型参数,自动资源管理,提供新的G1收集器,加强对非Java语言的调用,升级类加载架构等。

 

9、2014JDK1.8发布,Lambda表达式:

-  最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码。

-  语法增强 JAVA类型注解

 

1.2 JVM大事记

1、使用最为广泛的JVMHotSpot

 

2、HotSpotLongView Technologies开发Sun收购

 

3、2006 Java开源并建立OpenJDK

-  HotSpot成为Sun JDKOpenJDK中所带的虚拟机

4、2008 Oracle收购BEA

-  得到JRockit VM

 

5、2010Oracle收购Sun

-  得到HotSpot

 

6、Oracle宣布在JDK8时整合JRockitHotSpot,优势互补

-  Hotspot基础上,移植JRockit优秀特性

 

2 JAVA虚拟机规范

JVM遵循着冯·诺依曼体系结构的设计原理。冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操作码和地址码组成,操作码决定了操作类型和所操作的数的数字类型,地址码则指出地址码和操作数。而JVM通过在操作系统上建立虚拟机,自己定义出来的一套统一的数据结构和操作指令,把同一套语言翻译给各大主流的操作系统,实现了跨平台运行,可以说JVMjava的核心,是java可以一次编译到处运行的本质所在。

 

2.1 JAVA语言规范

1、语法定义:

语法定义

语法

IfThenStatement:

   if (Expression) Statement

ArgumentList:

   Argument

   ArgumentList , Argument

if(true){do sth;}

 

 

add(a,b,c,d);

 

2、词法结构:

词法结构

词法说明

-  \u + 416进制数字表示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-10

十进制:-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

深入JVM虚拟机(一) 初识JVM_第2张图片

 

深入JVM虚拟机(一) 初识JVM_第3张图片

 

2、特殊方法:

-  

-  

 

2.4 JVM的编译

-  源码到JVM指令的对应格式

-  JVM反汇编的格式:  [  [ ... ]] []

代码

指令代码

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多线程设计模式详解》



                --以上为《深入JVM虚拟机(一) 初识JVM》,如有不当之处请指出,我后续逐步完善更正,大家共同提高。谢谢大家对我的关注。

                                                                                                                                                                                      ——厚积薄发(yuanxw)


你可能感兴趣的:(#,JVM虚拟机)