什么是JVM
Java Virtual Machine 用来解析和运行java程序 JVM是一种虚拟机,它使计算机能够运行Java程序以及用其他语言编写的程序也被编译到Java字节码中。JVMM由一种规范详细说明,该规范正式描述了JVM实现规范中所需的内容,确保了熔岩程序跨不同实现的互操作性,因此使用Java开发的程序作者不必担心底层硬件平台的特殊性。JDK,JRE,JVM的关系
官网: https://docs.oracle.com/javase/8/docs/index.html 安装了jdk之后其实就默认了安装了hotspot 关注虚拟机就只要关注 hotspot即可 因为不管是openjdk还是orcal jdk都是默认使用的是hotspot虚拟机
Hotspot
JVM是一种java虚拟机的规范,很多厂商都会去进行实现,比如hotspot就是其中一款,下面就是hotspot虚拟机最常用的目前是HotSpot 可以java -version可以查看一下具体是什么虚拟机 官网地址:https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html接下来了解的都是关于hotspot相关的知识,围绕着这张图展开,那先看一下class Files
Classfile
1.生成class文件
public class User { private Integer age; private String name = "Jack"; private Double salary = 100.0; private static String address; public void say() { System.out.println("Jack Say..."); } public static Integer calc(Integer op1, Integer op2) { op1 = 3; Integer result = op1 + op2; return result; } public static void main(String[] args) { System.out.println(calc(1, 2)); } }
编译一下 用notepad++打开就可以看到
2.分析class文件
2.1.通用格式
官网地址 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
2.2.magic标准格式
- u4[magic]:在class中从左往右速度四个就是cafebabe
2.3.JDK版本号
在上面cafebabe往后数8个 我们可以将其放在计算器转换一下10进制可以看到是522.4.常量池数量
- u2[constant_pool_count]:
constant_pool_count:官方介绍 The value of the item is equal to the number of entries in the table plus one
2.5.常量结构表
- cp_info[constant_pool[constant_pool_count-1]]:每个常量到底是什么类型什么内容
继续按照官方文档走:The is a table of structures (§4.4) representing varIoUs string constants, class and interface names 他说打开4.4的文档看详细信息 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4
- 第一个例子:
cp_info { u1 tag; //表示常量的类型 u1 info[]; //常量具体的内容是什么 }
在user.class中已经走到0043了接下来的u1也就是0a
u1:0a 转换后是10进制是10,然后按照下面这个图找一下10对应的值是什么?
CONSTANT_Methodref_info { u1 tag; //= 0a 也就是10 u2 class_index; //0010 也就是16 u2 name_and_type_index; //0023 也就是35 }
第二个例子:
上面走到了0023 下面就是08 换算一下就是8 对应表就是CONSTANT_StringCONSTANT_String_info { u1 tag; //08 = 8 u2 string_index; //0024 = 36 }
2.6.验证猜想
上面按照文档一步步推敲 那么来验证一下是否正确 反汇编指令javap javap -c -p -v User.class字面量:文本字符串,final修饰等 符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。