• 1.认识JVM之Classfile


    目录

    1.认识JVM之Classfile:https://www.cnblogs.com/nuti/p/16270652.html

    2.认识JVM之类加载机制:https://www.cnblogs.com/nuti/p/16270672.html

    3.认识JVM之运行时数据区: https://www.cnblogs.com/nuti/p/16270703.html

    4.认识JVM之编译器: https://www.cnblogs.com/nuti/p/16270741.html

    5.认识JVM之垃圾收集器: https://www.cnblogs.com/nuti/p/16270755.html

    6.认识JVM之JVM内存模型: https://www.cnblogs.com/nuti/p/16270816.html

    什么是JVM

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

    JDK,JRE,JVM的关系

    0
    安装了jdk之后其实就默认了安装了hotspot
    关注虚拟机就只要关注 hotspot即可 因为不管是openjdk还是orcal jdk都是默认使用的是hotspot虚拟机

    Hotspot

    JVM是一种java虚拟机的规范,很多厂商都会去进行实现,比如hotspot就是其中一款,下面就是hotspot虚拟机
    0
    最常用的目前是HotSpot
    可以java -version可以查看一下具体是什么虚拟机
    接下来了解的都是关于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.通用格式

    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的文档看详细信息
     
      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修饰等
    符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    windows7 下 oracle 10g服务端如何安装?
    DOM模块支持测试
    获取css属性
    在webstorm启动nginx服务器
    获取link链接
    innerText
    外部动态加载javascript
    外部动态加载css
    冒泡排序
    Nodelist
  • 原文地址:https://www.cnblogs.com/nuti/p/16270652.html
Copyright © 2020-2023  润新知