深入JVM内核1 初识JVM

深入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 一些特殊的方法
<clinit>
<init>

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反汇编的格式
<index> <opcode> [ <operand1> [ <operand2>... ]] [<comment>]

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容