• jvm初识


    一、什么是jvm?

    1.1对比物理机

    物理机:
    在这里插入图片描述
    jvm:
    在这里插入图片描述
    Java虚拟机与物理机

    • Class文件类比输入设备
    • CPU指令集类比输出设备
    • JVM类比存储器、控制器、运算器等
    1.2 JVM products

    有哪些版本?

    • Oracle:HotSpot、JRockit
    • IBM:J9 VM
    • Ali:TaobaoVM
    • Zual:Zing

    最常用的目前是HotSpot,可以通过java -version命令查看

    1.3 JDK JRE JVM 三者之间的关系

    官网: https://docs.oracle.com/javase/8/docs/index.html
    在这里插入图片描述
    jre 包含了jvm,jdk 包含jdk

    1.4 结合JDK看JVM
    1. 能够把Class文件翻译成不同平台的CPU指令集
    2. 也是Write Once Run Anywhere的保证
      在这里插入图片描述
    1.5 HotSpot JVM Architecture

    https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
    在这里插入图片描述

    二、 class file

    Java源码文件、Kotlin源码文件、Groovy源码文件等都可以编译成class文件执行。

    2.1 java 测试类
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    2.2 编译过程

    javac User.java->User.class
    在这里插入图片描述

    2.3Class 文件格式

    官方文档
    https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
    class 文件是一个16进制的文件
    在这里插入图片描述

    IDEA插件(BindED)——查看class文件的十六进制

    文件的格式

    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];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    2.4 文件的解析

    user.class对应的16进制文件
    在这里插入图片描述
    对比类文件的格式,和上面16进制数据进行解析

    1. cafebabe
      u4 magic 对应的就是16进制中的 cafebabe ,cafebabe 代表的是一个class类文件的表示,只要是一个class文件就一定是 cafebabe 开头

    2. 0000+0034:minor_version+major_version
      16进制的34等于10进制的52,表示JDK的版本为8

    3. 0043:constant_pool_count
      16进制的43等于10进制的67,表示常量池中常量的数量是66

    4. cp_info:constant_pool[constant_pool_count-1]
      字面量:文本字符串,final修饰的常量等
      符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符

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

    常量的基本结构

    cp_info {
    	2u1 tag;
    	u1 info[];
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2.5 反汇编

    javap ‐v ‐c ‐p User.class > User.txt 进行反编译,查看字节码信息和指令等信息
    JVM相对class文件来说可以理解为是操作系统;class文件相对JVM来说可以理解为是汇编语言或者机 器语言。

    3.类加载机制

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

    3.1 加载
    3.3.1 4种ClassLoader

    在这里插入图片描述

    3.1.2 双亲委派机制
    				try {
                        if (parent != null) {
                        	// 先找父加载器
                            c = parent.loadClass(name, false);
                        } else {
                            c = findBootstrapClassOrNull(name);
                        }
                    } catch (ClassNotFoundException e) {
                        // ClassNotFoundException thrown if class not found
                        // from the non-null parent class loader
                    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 检查某个类是否已经加载
      自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个Classloader已加载,就视为已加载此类,保证此类只所有ClassLoader加载一次。
    2. 加载的顺序
      自顶向下,也就是由上层来逐层尝试加载此类。
    3.1.3 java代码
    public class Demo {
        public static void main(String[] args) {
            // App ClassLoader
            System.out.println(new Demo().getClass().getClassLoader());
            // Ext ClassLoader
            System.out.println(new Demo().getClass().getClassLoader().getParent());
            // Bootstrap ClassLoader
            System.out.println(new Demo().getClass().getClassLoader().getParent().getParent());
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果
    在这里插入图片描述
    bootstrap classloader 是c语言实现的打印不出来

    3.1.4 破坏双亲委派
    1. tomcat
      在这里插入图片描述

    (2)SPI机制
    (3)OSGi

    3.2Linking
    3.2.1 Verification

    保证被加载类的正确性

    3.2.2 Preparation

    为类的静态变量分配内存,并将其初始化为默认值

    3.2.3 Resolution

    把类中的符号引用转换为直接引用

    3.3 Initialization

    对类的静态变量,静态代码块执行初始化操作

    04 运行时数据区

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

    4.1Method Area(方法区)

    JVM运行时数据区是一种规范,真正的实现在JDK 8中就是Metaspace,在JDK6或7中就是Perm Space方法区是各个线程共享的内存区域,在虚拟机启动时创建,虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却又一个别名叫做Non-Heap(非堆),目的是与Java堆区分开来。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。当方法区无法 满足内存分配需求时,将抛出OutOfMemoryError异常。

  • 相关阅读:
    mysql读取文件
    【故障公告】会员救园,阿里云故障
    C++异常处理
    C++高级 文件和流
    使用python编程数学挖掘-数据仓库与OLAP(课程5)
    接口自动化测试:mock server之Moco工具
    数智化升级必答题,尚美数智如何成为酒店行业标准答案?
    Flameshot源码编译方法
    无人机航迹规划:七种智能优化算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划--提供MATLAB代码
    DNS域名解析服务
  • 原文地址:https://blog.csdn.net/weixin_40980639/article/details/125868894