ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1.认识JVM之Classfile

2022-05-14 17:00:07  阅读:196  来源: 互联网

标签:info Classfile 常量 认识 虚拟机 JVM class String


什么是JVM

Java Virtual Machine 用来解析和运行java程序 JVM是一种虚拟机,它使计算机能够运行Java程序以及用其他语言编写的程序也被编译到Java字节码中。JVMM由一种规范详细说明,该规范正式描述了JVM实现规范中所需的内容,确保了熔岩程序跨不同实现的互操作性,因此使用Java开发的程序作者不必担心底层硬件平台的特殊性。 0

JDK,JRE,JVM的关系

0
官网: https://docs.oracle.com/javase/8/docs/index.html 安装了jdk之后其实就默认了安装了hotspot 关注虚拟机就只要关注 hotspot即可 因为不管是openjdk还是orcal jdk都是默认使用的是hotspot虚拟机

Hotspot

JVM是一种java虚拟机的规范,很多厂商都会去进行实现,比如hotspot就是其中一款,下面就是hotspot虚拟机 0
最常用的目前是HotSpot 可以java -version可以查看一下具体是什么虚拟机 官网地址:https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
接下来了解的都是关于hotspot相关的知识,围绕着这张图展开,那先看一下class Files

Classfile

1.生成class文件

0  
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++打开就可以看到

0

2.分析class文件

2.1.通用格式

官网地址 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
0 上面生成的class文件照着这个模板去读一下

2.2.magic标准格式

  1. u4[magic]:在class中从左往右速度四个就是cafebabe
magic:class的标准文件格式

2.3.JDK版本号

  1. u2+u2[minor_version-major_version]: 在class文件中是00000034
在上面cafebabe往后数8个 我们可以将其放在计算器转换一下10进制可以看到是52 0 0 52就是他的最大版本号 表示他的jdk版本是8 那么接着往下

2.4.常量池数量

  1. u2[constant_pool_count]:
接着往下数4个 就是0043 转换成10就是67 因为已经加了1 减1之后就是66个,也就是有66个常量。 常量 = final修饰的变量 + 字面量
constant_pool_count:官方介绍 The value of the item is equal to the number of entries in the table plus one

2.5.常量结构表

  1. 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
 
    1. 第一个例子:
cp_info {
    u1 tag; //表示常量的类型
    u1 info[]; //常量具体的内容是什么
}

在user.class中已经走到0043了接下来的u1也就是0a

u1:0a 转换后是10进制是10,然后按照下面这个图找一下10对应的值是什么?

0 对照这张表就可以看到是CONSTANT_Methodref 然后往下翻找到Methodref_info的格式
CONSTANT_Methodref_info {
    u1 tag; //= 0a 也就是10
    u2 class_index; //0010 也就是16
    u2 name_and_type_index; //0023 也就是35
}

  第二个例子:

上面走到了0023 下面就是08 换算一下就是8 对应表就是CONSTANT_String
CONSTANT_String_info {
    u1 tag; //08 = 8 
    u2 string_index; //0024 = 36
}

  2.6.验证猜想

上面按照文档一步步推敲
  • cafebabe嘛就是class的标准开头
  • 还有一个版本是jdk8
  • 常量池数量有66个
  • 常量的结构目前就看了2个 按照这个两个来说就是 Methodref #16 #35 String #36
那么来验证一下是否正确 反汇编指令javap javap -c -p -v User.class 0 0 常量池的数量为66个 所以这里的常量也并不是我们平时开发中所理解的final修饰的常量而是字面量+符号引用
字面量:文本字符串,final修饰等 符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符
                     

标签:info,Classfile,常量,认识,虚拟机,JVM,class,String
来源: https://www.cnblogs.com/nuti/p/16270652.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有