【JVM】类加载器与双亲委派模型(一)

2024-08-26 00:58

本文主要是介绍【JVM】类加载器与双亲委派模型(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景

       

      在我们参加的项目中有这样一种情况:在编译环境下,使用maven中的repository下的jar包,而在运行时环境时使用Jboss中的moudles下的jar包。

       但是部署该模块的时候,却出现了错误:ClassNotFoundException,但是我的jboss mouldes下确实是有这个Jar包呀,为什么还会出现ClassNotFoundException呢?

       解决思路:jar包有,但未找到,那就是寻找的路径是错误的,也就是类加载的时候出现了问题,要想解决问题,我们还是得先了解一下类加载器,类是如何被加载的?  


二、何为类加载器?


       类加载器为java语言的创新,也是Java语言流行的重要原因之一。它使得Java类可以被动态加载到Java虚拟机中并执行。它从JDK就出现了,是为了满足Java Applet的需要而开发出来的。它是用来加载Java类到Java虚拟机中,一般来说,Java虚拟机使用Java类的方式如下:java 源程序在经过java编译器编译之后就会被转换为Java字节代码(.class 文件)。类加载器负责读取Java字节代码,并转换成Java.lang.class类的一个实例。基本上所有的类加载器都是Java.lang.classLoader类的一个实例。


三、Java中的类加载器分类


Java中的类加载器大致可以分为两类。一类是系统提供的,另一类则是由java应用开发人员编写的。系统提供的类加载器主要有:引导类加载器,扩展类加载器,系统类加载器。

       1、引导类加载器

      

       用来加载java的核心库,是用原生代码来实现的,并不继承自java.lang.classLoader。负责加载$JAVA_HOME中的jre/lib/rt.jar里面所有的class。


       2、扩展类加载器

       

       用来加载Java的扩展库。Java虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。负责加载Java平台的扩展功能jar包,包括$JAVA_HOME中jre/lib/*.jar或java.ext.dirs指定目录下的jar包。


       3、系统(应用程序)类加载器

       

       它根据Java应用的类路径来加载java类。一般来说,java应用的类都是由它来完成加载的。可以通过classloader.getSystemClassLoader()来获取的。


       除了系统提供的类加载器外,开发人员可以通过集成Java.lang.classLoader类的方式来实现自己的类加载器。除了引导类加载器外,所有的类加载器都有一个父类加载器。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器java类的类加载器。其中类加载器树状组织结构示意图如下:





 四、加载类的过程


         JVM将类加载过程分为三个步骤:装载,链接,和初始化三个步骤。另外,链接又分为三个步骤(验证,准备,解析)如下图所示:


         




      (1)装载

        查找并加载类的二进制数据

      (2)链接

               验证:确保被加载类的正确性;

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

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

      (3)初始化

          为类的静态变量赋予正确的初始值;

          

        类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.class对象,用来封装类在方法区类的对象。



        

        


       至此,类的加载器,以及类是如何加载的已经介绍完毕,下篇博客会介绍一下类加载模型-双亲委派模型。

这篇关于【JVM】类加载器与双亲委派模型(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107099

相关文章

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进