一、什么是JVM?
JVM是一种规范,虚构的计算机(冯诺依曼计算机结构)。跨语言的平台。
也就是编译后是
二、JVM要学什么?
- 源码到类文件
- 类文件到JVM
- JVM中各种处理(内部结构、执行方式、垃圾回收、本地调用)
2.1 源码到类文件
2.1.1 Javac过程
XXX.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> XXX.class文件
2.1.2 class文件格式-十六进制
2.1.3 ClassFile Struucture
官网地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
2.1.4 简单分析
magic u4 --> cafe babe
minor_version u2 -->0000
major_version u2-->0034 十进制数52,表示 JDK8
constant_pool_count u2 --> 00a4 十进制数164 常量池的数量为164
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 加载原则(双亲委派机制)
- 检查某个类是否已经被加载自底向上,从Custom ClassLoader至Bootstrap ClassLoader逐层检查,只要有一个ClassLosder加载了,保证此类只被加载一次。
- 加载顺序
自顶向下,由上层来逐层加载此类。
2.2.4.3 破坏双亲委派
- tomact
- SPI机制(Service Provider Interface)Java中的SPI(Service Provider Interface)机制是一种用于实现组件化架构的技术。它允许在运行时动态地扩展或替换框架或库中的实现类。
Java提供了一些标准的SPI实现,例如JDBC、JNDI、JAXP等。开发人员也可以使用SPI机制来实现自己的插件框架。 - OSGi
OSGi(Open Services Gateway Initiative)是一种模块化系统架构,可以使Java应用程序以模块化的方式进行开发、部署和管理。
如Eclipse、Apache Felix
标签:java,--,虚拟机,class,JVM,2.2,2.1,ClassLoader,加载 From: https://blog.51cto.com/u_15996162/6145622