Java虚拟机JVM类加载机制(从类文件到虚拟机)

 更新时间:2021年06月04日 09:54:59   作者:smileNicky  
所谓的类加载机制就是虚拟机将class文件加载到内存,并对数据进行验证,转换解析和初始化,形成虚拟机可以直接使用的java类型,本文给大家介绍类加载机制过程从类文件到虚拟机的详细说明,感兴趣的朋友跟随小编一起看看吧

一、类加载机制简介

什么是类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类加载机制:所谓的类加载机制就是虚拟机将class文件加载到内存,并对数据进行验证,转换解析和初始化,形成虚拟机可以直接使用的java类型(即java.lang.class)

JVM的类加载机制分为五个部分:加载,验证,准备,解析,初始化,图示:

在这里插入图片描述

二、类加载机制过程

 2.1、加载(Load)

所谓JVM加载过程,是查找和导入class文件,加载过程:

(1)通过类的全限定名获取这个类的二进制字节流;

(2)将字节流所代表的静态存储结构转换为方法区的运行时数据结构

在这里插入图片描述

(3)在JVM堆中生成代表这个类的java.lang.class对象(作为方法区中这些数据的访问入口)

在这里插入图片描述

2.2、连接(Linking)

2.2.1、验证(Verify)

JVM验证(Verify)这个过程是为了保证被加载类的正确性,保证其它后续步骤的正确正常执行,验证的过程包括:

  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证

2.2.2、准备(Prepare)

准备(Prepare)阶段,是为类变量分配内存并设置初始化值的。

eg:

public static int v = 9092;

注意:在类加载的准备(Prepare)阶段,v变量是赋值为0的而不是9092,这个值是在后续过程才赋值的

 private static int i;
public static void main(String[] args) {
    // 正常打印出0,静态变量在类加载的准备阶段会赋值0
    System.out.println(i);
}
public static void main(String[] args) {
   // 编译报错,因为局部变量没赋值不会自动生成初始化值
    int i;
    System.out.println(i);
}

2.2.3、解析(Resolve)

这个阶段是将常量池中的符号引用转换为直接引用的过程。所谓符号引用就是class文件中的:

1.  CONSTANT_Class_info
2.  CONSTANT_Field_info
3.  CONSTANT_Method_info
// 等等
...

直接引用可以是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。

直接引用和字符引用一个最明显的区别是,直接引用是目标是已经被加载到内存的,而字符引用并不一定已经加载到内存。

2.3、初始化(Initialize)

类加载的初始化阶段,是对类的变量和代码块执行初始化操作,是执行类构造器的过程,换句话说是对类的静态变量,静态代码块执行初始化操作

三、类加载器Classloader

 3.1、类加载器简介

类的加载过程是在JVM之外的,目的是为了让应用程序决定如何获取需要的类。

类加载,也即类加载器通过类的全限定名获取其定义的二进制字节流,顾名思义,类加载器就是来加载class文件的。

3.2、类加载器分类

类加载器可以分为启动类加载器,拓展类加载器,应用程序类加载器

在这里插入图片描述

  • 1)、 Bootstrap classload(启动类加载器):负责加载$JAVA_HOMEjre/lib/rt.jar里所有的class或者--Xbootclasspath系统参数指定路径下的jar包。这个实现是由c++实现的
  • 2)、Extension Classload(拓展类加载器):负责加载java平台中拓展的一些jar,包括$JAVA_HOMEjre/lib/ext/*.jar或者-Djava.ext.dirs指定目录下的jar包
  • 3)、Application Classload(应用程序类加载器):负责加载classpath中指定的jar或者Djava.class.path指定路径的类和jar包
  • 4)、custom classload(自定义的类加载器):通过java.lang.ClassLoader的子类实现的类,属于程序根据需要自定义拓展的类加载器,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

3.3、双亲委派

类的加载原则:按照“双亲委派”的原则加载的,当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此也即class类的加载,按照自顶向下的规则,由Bootstrap Classload到custom classload,就是由上层的加载类来加载类

目的:不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。

附录:参数资料

https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

以上就是Java JVM类加载机制(从类文件到虚拟机)的详细内容,更多关于JVM类加载机制的资料请关注脚本之家其它相关文章!

相关文章

  • springBoot项目中的static和templates文件夹的使用

    springBoot项目中的static和templates文件夹的使用

    本文主要介绍了springBoot项目中的static和templates文件夹的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • RocketMQ Namesrv架构工作原理详解

    RocketMQ Namesrv架构工作原理详解

    这篇文章主要为大家介绍了RocketMQ Namesrv架构工作原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 解决idea反编译失败无法查看jar包的源码问题

    解决idea反编译失败无法查看jar包的源码问题

    在IntelliJ IDEA中查看jar包源码的两种方法:下载反编译软件JD-GUI或安装JavaBytecodeDecompiler插件
    2024-12-12
  • shiro 认证流程操作

    shiro 认证流程操作

    这篇文章主要介绍了shiro 认证操作的相关资料,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • spring mvc配置bootstrap教程

    spring mvc配置bootstrap教程

    这篇文章主要为大家详细介绍了spring mvc配置bootstrap,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java中String类常用类型实例总结

    Java中String类常用类型实例总结

    在我们开发中经常会用到很多的常用的工具类,这里做一个总结,下面这篇文章主要给大家介绍了关于Java中String类常用类型的相关资料,String类代表字符串,需要的朋友可以参考下
    2021-12-12
  • 在JAVA Web项目中动态加载DLL/SO文件的方法

    在JAVA Web项目中动态加载DLL/SO文件的方法

    在JAVA Web项目中,我们经常需要调用一些第三方库或者实现一些JAVA本身不支持的功能,这时,我们可能会考虑使用JNI来调用DLL或SO文件,然而,因此,本文将介绍如何在JAVA Web项目中动态加载DLL/SO文件,需要的朋友可以参考下
    2024-12-12
  • 使用Java实现一个解析CURL脚本小工具

    使用Java实现一个解析CURL脚本小工具

    文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KV Map结构,获取URL路径、请求类型,解析URL参数列表和Body请求体,感兴趣的小伙伴跟着小编一起来看看吧
    2025-02-02
  • Java基础之序列化与反序列化详解

    Java基础之序列化与反序列化详解

    这篇文章主要介绍了Java基础之序列化与反序列化详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • 深入理解注解与自定义注解的一些概念

    深入理解注解与自定义注解的一些概念

    今天给大家带来的文章是注解的相关知识,本文围绕着注解与自定义注解的一些概念展开,文中详细介绍了这些知识,需要的朋友可以参考下
    2021-06-06

最新评论