关于文章

JVM系列每一篇文章我都录制了对应的视频,由于CSDN不能直接发送视频资料,如果想要作者录制的免费视频资料,可以加QQ:3139882589。这个是作者QQ,如果有问题想跟作者咨询,也可以加到我们的java技术交流QQ群。加作者请备注暗号 [CSDN]

初识JVM

我们从这篇文章开始就要正式开始学习JVM了,我们学习一个知识,肯定首先要去最权威的地方进行学习,所以我们学习的节奏是跟着官网来进行学习,同时我们学习的是主流的JDK8这样的一个版本。

Java官网:https://docs.oracle.com/javase/8/

2.1 JVM是什么?

JVM (Java Virtual Machine,Java虚拟机)

一次编写,到处运行(Write Once Run Anywhere)

2.2 JDK JRE JVM之间的关系

我们从官网的Developer Guides进去,如下。

我们会发现这样一段话,

总结上面这段话意思,大概的意思就是JDK包含JRE,而JRE提供了JVM以及其他组件,用来运行JAVA编写的程序。

下面这张描述了JVM,JRE,JDK关系的图也相当于对上面那段话做了解释。如下

2.3 源码到类文件

  • 源码Demo

      private String name="carlNB";private int age;private final double salary=100;private static String address;private final static String hobby="Programming";private static Object obj=new Object();public void say(){System.out.println("person say...");}public static int calc(int op1,int op2){op1=3;int result=op1+op2;Object obj=new Object();return result;}public static void main(String[] args){calc(1,2);}
    }
    

编译指令:JAVAC Person.java

2.4 分析编译器干了什么事

Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> Person.class文件

由上可知,其实我们的编译器其实做的事情其实就是“对等信息转换”。JAVA文件中的信息其实跟我们Class文件中的信息,其实是一样的。

2.5 分析Class文件

  • 16进制
002c 0900 0d00 2d06 4059 0000 0000 0000
0900 0d00 2e09 002f 0030 0800 310a 0032
0033 0700 340a 000d 0035 0900 0d00 3607
0037 0100 046e 616d 6501 0012 4c6a 6176
612f 6c61 6e67 2f53 7472 696e 673b 0100
0361 6765 0100 0149 0100 0673 616c 6172
7901 0001 4401 000d 436f 6e73 7461 6e74
......
  • The ClassFile Structure

官网: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

ClassFile {u4             magic;u2             minor_version;u2             major_version;u2             constant_pool_count;cp_info        constant_pool[constant_pool_count-1];u2             access_flags;u2             this_class;u2             super_class;u2             interfaces_count;u2             interfaces[interfaces_count];u2             fields_count;field_info     fields[fields_count];u2             methods_count;method_info    methods[methods_count];u2             attributes_count;attribute_info attributes[attributes_count];
}
  • Simple analysis

    • u4 : ca fe ba be

      magic:The magic item supplies the magic number identifying the class file format
      
    • u2+u2:0000+0034,34等于10进制的52,表示JDK8

      minor_version
      major_version
      
    • u2:003f=63(10进制)

      constant_pool_count:
      The value of the constant_pool_count item is equal to the number of entries in the constant_pool table plus one.
      

      表示常量池中的数量是58

      cp_info constant_pool[constant_pool_count-1]

      The constant_pool is a table of structures representing various string constants, class and interface names, field names, and other constants that are referred to within the ClassFile structure and its substructures. The format of each constant_pool table entry is indicated by its first "tag" byte.
      The constant_pool table is indexed from 1 to constant_pool_count - 1.
      

      常量池主要存储两方面内容:字面量(Literal)和符号引用(Symbolic References)

      字面量:文本字符串,final修饰等
      符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符
      

2.6 反编译验证

用javap指令验证上述猜想正确性

编译指令:javap -v -p Person.class

进行反编译之后,查看字节码信息和指令等信息

是否有一种感觉?

JVM相对class文件来说可以理解为是操作系统;class文件相对JVM来说可以理解为是汇编语言或者机器语言。

2.7 Continous analysis

上面分析到常量池中常量的数量是62,接下来我们来具体分析一下这62个常量

cp_info constant_pool[constant_pool_count-1] 也就是这块包括的信息

cp_info其实就是一个表格的形式

All constant_pool table entries have the following general format:

cp_info {u1 tag;u1 info[];
}

官网:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4

(1)往下数一个u1,即0a->10:代表的是CONSTANT_Methodref,表示这是一个方法引用

CONSTANT_Fieldref_info {u1 tag;u2 class_index;u2 name_and_type_index;
}

往下数u2和u2

u2,即00 0a->10:代表的是class_index,表示该方法所属的类在常量池中的索引
u2,即00 2b->43:代表的是name_and_type_index,表示该方法的名称和类型的索引

#1 = Methodref       #10,#43

(2)往下数u1,即08->8:表示的是CONSTANT_String,表示字符串类型

CONSTANT_String_info {u1 tag;u2 string_index;
}

往下数u2

u2,即00 2c->44:代表的是string_index

#1 = Methodref       #10,#43
#2 = String          #44

(3)往下数u1,即09->9:表示的是CONSTANT_Fieldref,表示字段类型

CONSTANT_Fieldref_info {u1 tag;u2 class_index;u2 name_and_type_index;
}

往下数u2和u2

u2,即00 0d->13:代表的是class_index
u2,即00 2d->45:代表的是name_and_type_index

#1 = Methodref       #10.#43
#2 = String          #44
#3 = Fieldref        #13.#45

index;

u2 name_and_type_index;
}


往下数u2和u2u2,即00 0d->13:代表的是class_index
u2,即00 2d->45:代表的是name_and_type_index
#1 = Methodref       #10.#43
#2 = String          #44
#3 = Fieldref        #13.#45

JVM成神之路(二)-- JDK,JER与JVM的关系相关推荐

  1. JVM成神之路-Java内存模型(JMM)

    Java 内存模型基础 什么是 Java 内存模型(JMM-共享内存模型) 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量 ...

  2. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化

    Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...

  3. JVM成神之路-JVM内存结构

    线程私有 程序计数器 当前线程所执行的字节码的行号指示器 对于 Java 方法,记录正在执行的虚拟机字节码指令的地址:对于 native 方法,记录值为空(Undefined) 唯一一个Java 虚拟 ...

  4. JVM成神之路-Java垃圾回收

    Java垃圾回收机制 为什么要进行垃圾回收? 随着程序的运行,内存中存在的实例对象.变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用内存不足造成一些不必要 ...

  5. JVM成神之路-JVM引用模型

    本文通过探析Java中的引用模型,分析比较强引用.软引用.弱引用.虚引用的概念及使用场景,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目提供参考. Java的引用 对于Java中的垃圾回收 ...

  6. JVM成神之路-类加载机制-双亲委派,破坏双亲委派

    概述 概念 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接时候用的Java类型. 类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存 ...

  7. JVM成神之路-Java对象模型

    首先我们要知道: 在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用. Java对象包含三个部分 一个Java对象可以分为三部分存储在内存中,分别是:对象头(Hea ...

  8. JVM成神之路(十一) -- JVM常用命令解析

    3.2 常用命令 3.2.1 jps 查看java进程 The jps command lists the instrumented Java HotSpot VMs on the target sy ...

  9. (八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析

    引言 在<GC分代篇>中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析,但在开始前,先来看看JDK的发布记录中关 ...

最新文章

  1. python第一个公开发行版_Python基础篇【第一篇】:python入门
  2. 贵州2021高考状元成绩查询,2021年贵州高考最高分多少分,历年贵州高考状元
  3. icu入院宣教流程图_ICU患者及家属的健康教育PPT.ppt
  4. 【Tools】TeamViewer安装教程
  5. 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
  6. Android中的Handler的具体用法
  7. 嵌入式linux学习
  8. Python爬虫实战:应用宝APP数据信息采集
  9. 态度决定一切细节决定成败_字体设计可以决定设计的成败:选择字体的过程
  10. java中级程序员面试
  11. K2P没有无线信号LED灯不亮,居然成功修复
  12. 钢铁行业关键业务系统介绍
  13. 「SQL数据分析系列」4.过滤操作
  14. ArrayList添加一个元素的过程(中部插入以及尾部添加)
  15. ue4 项目模板_Unreal 学习和使用UE4的第二步——创建项目和模板试玩 - 游戏编程 ️...
  16. js实现小球抛物线运动
  17. 使用 TDD 测试驱动开发来构建 Laravel REST API 1
  18. mysql提取日期中的年月
  19. 低功耗HC32F002C4PZ
  20. Stm32之RTC时钟(2021-07-26)

热门文章

  1. C++最后一次实验及实验总结
  2. MySQL 学习笔记——基础 DQL 查询语言
  3. ansible从入门到放弃
  4. conda安装pytorch下载太慢
  5. 使用modelsim编译altera库
  6. 三角形外接球万能公式_外接球半径常见的求法
  7. 给我两小时,我能写很长长长长长长的APP测试用例!
  8. php 促销方案,七步就轻松搞定,促销活动方案
  9. 讲解关于编写跨平台Java程序时的注意事项 选择自 tiewen 的 Blog
  10. 【操作系统实验】各种幺蛾子