深入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>

posted @ 2017-09-10 16:44  作巴  阅读(1186)  评论(0编辑  收藏  举报