Java虚拟机(JVM_1)

一、什么是JVM?

JVM是一种规范,虚构的计算机(冯诺依曼计算机结构)。跨语言的平台。
也就是编译后是 .class文件的语言,都能在JVM中运行。例如Java、Kotlin、Scala、Jruby
在这里插入图片描述

二、JVM要学什么?

在这里插入图片描述

  1. 源码到类文件
  2. 类文件到JVM
  3. JVM中各种处理(内部结构、执行方式、垃圾回收、本地调用)

2.1 源码到类文件

2.1.1 Javac过程

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

在这里插入图片描述

2.1.2 class文件格式-十六进制

cafe babe 0000 0034 00a4 0900 1900 8109
0019 0082 0900 1900 8309 0019 0084 0900
1900 8509 0019 0086 0700 870a 0007 0088
0800 890a 0007 008a 0a00 1900 8b0a 0007
008c 0800 8d0a 0019 008e 0800 8f0a 0019
0090 0800 910a 0019 0092 0800 930a 0019
0094 0800 950a 0019 0096 0800 970a 0007
0098 0700 990a 0019 009a 0a00 9b00 9c0a
009b 009d 0a00 1e00 8807 009e 0700 9f01
0010 7365 7269 616c 5665 7273 696f 6e55
4944 0100 014a 0100 0d43 6f6e 7374 616e
7456 616c 7565 0500 0000 0000 0000 0101
0002 6964 0100 104c 6a61 7661 2f6c 616e
672f 4c6f 6e67 3b01 0019 5275 6e74 696d
6556 6973 6962 6c65 416e 6e6f 7461 7469
6f6e 7301 0029 4c69 6f2f 7377 6167 6765
722f 616e 6e6f 7461 7469 6f6e 732f 4170
694d 6f64 656c 5072 6f70 6572 7479 3b01
0005 7661 6c75 6501 0008 e997 aee9 a298
6964 0100 2d4c 636f 6d2f 6261 6f6d 6964
6f75 2f6d 7962 6174 6973 706c 7573 2f61
......

2.1.3 ClassFile Struucture

官网地址: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];
}

2.1.4 简单分析

magic u4 --> cafe babe

The magic item supplies the magic number identifying the class file format; it has the value 0xCAFEBABE.

minor_version u2 -->0000

major_version u2–>0034 十进制数52,表示 JDK8

constant_pool_count u2 --> 00a4 十进制数164 常量池的数量为164

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

2.1.5 javap验证

javap -v -p xxx.class 进行反编译,查看字节码信息和指令等信息

2.2 类文件到虚拟机(类加载机制)

类加载机制指虚拟机把class文件加载到内存,并对数据进行校验、转换解析和初始化。
在这里插入图片描述

2.2.1 装载(Load)

主要是查找和导入class文件。
step 1 -->通过一个类的全限定名获取定义此类的二进制字节流;
step 2 -->将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构;
step 3 -->在堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。
在这里插入图片描述

2.2.2 链接(Link)

2.2.2.1 验证(Verify)

保证被加载类的正确性!文件格式验证、元数据验证、字节码验证、符号引用验证。

2.2.2.2 准备(Prepare)

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

2.2.2.3 解析(Resolve)

把类中符号引用转换为直接引用
符号引用:一组符号来描述目标,可以是任何字面量。
直接引用:直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进 行。

2.2.3 初始化(Initialize)

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

2.2.4 类加载器ClassLoader

用来装载class类

2.2.4.1 分类

Boostreap ClassLoader —>C++实现的
Extension ClassLoader ---->扩展
App ClassLoader ----->ClassPath指定路径下
Coustom ClassLoader —>自定义

2.2.4.2 加载原则(双亲委派机制)

在这里插入图片描述

  1. 检查某个类是否已经被加载
    自底向上,从Custom ClassLoader至Bootstrap ClassLoader逐层检查,只要有一个ClassLosder加载了,保证此类只被加载一次。
  2. 加载顺序
    自顶向下,由上层来逐层加载此类。
2.2.4.3 破坏双亲委派
  1. tomact
    在这里插入图片描述
  2. SPI机制(Service Provider Interface)
    Java中的SPI(Service Provider Interface)机制是一种用于实现组件化架构的技术。它允许在运行时动态地扩展或替换框架或库中的实现类。
    Java提供了一些标准的SPI实现,例如JDBC、JNDI、JAXP等。开发人员也可以使用SPI机制来实现自己的插件框架。
  3. OSGi
    OSGi(Open Services Gateway Initiative)是一种模块化系统架构,可以使Java应用程序以模块化的方式进行开发、部署和管理。
    如Eclipse、Apache Felix
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值