当前位置: 首页 > news >正文

JVM知识总结(类加载器)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

类加载器

Bootstrap引导类加载器

引导类加载器也被称为启动类加载器或根类加载器,指BootstrapClassLoader

引导类加载器使用C++语言实现,是JVM自身的一部分,主要负责将<JAVA_HOME>\lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中。

Extension拓展类加载器

位于HotSpot源码目录中的sun.misc.Launcher$ExtClassLoader位置。

它主要负责加载<JAVA_HOME>\lib\ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库。

Application系统类加载器

位于HotSpot源码目录中的sun.misc.Launcher$AppClassLoader位置。

它负责加载系统类路径java -classpath-D java.class.path指定路径下的类库,也就是classpath`路径。

该类加载器是程序的默认类加载器,可以通过ClassLoader.getSystemClassLoader()方法可以直接获取到它。

自定义类加载器

如果需要自定义类加载器,只需要继承ClassLoader类,但继承ClassLoader需要自己重写findClass()方法并编写加载逻辑。

线程上下文类加载器

很多服务提供者接口(Service Provider Interface,SPI),这些接口允许第三方为它们提供实现,如常见的SPIJDBC、JNDI等,这些SPI的接口属于Java核心库,一般存在rt.jar包中,由启动类加载器(Bootstrap)加载,而SPI的第三方实现代码则是作为Java应用所依赖的jar包被存放在classpath路径下。

由于SPI接口中的代码需要加载第三方实现类并调用其相关函数,但SPI的核心接口类是由启动类加载器(Bootstrap)加载的,Bootstrap加载器无法直接加载SPI的实现类。

SPI提供了一种动态的服务发现机制(约定),只要第三方在编写实现类时,在工程内新建一个META-INF/services/目录并在该目录下创建一个与服务接口名称同名的文件,那么在程序启动的时候,就会根据约定去找到所有符合规范的实现类,然后交给线程上下文类加载器进行加载处理。

线程的上下文类加载器默认设置的就是系统类加载器(System)。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 医疗大健康解决方案HIS方案
  • C# Unity 面向对象补全计划 七大原则 之 迪米特法则(Law Of Demeter )难度:☆☆☆ 总结:直取蜀汉
  • MongoDB的复合通配符索引详解
  • ulimit
  • ShardingSphere之ShardingProxy集群部署
  • C# 在Word中插入或删除分节符
  • 创建一个简单的贪吃蛇游戏:HTML、CSS和JavaScript教程
  • VS2022使用.Net Framework4.0方法
  • 【实战营彩蛋InternLM 1.8B 模型 Android 端侧部署实践
  • GitHub开源项目精选:用React、TypeScript和Framer Motion复刻MacOS桌面
  • 内核函数调试
  • 机械学习—零基础学习日志(数学基础汇总1)
  • 如何识别并防御漏洞扫描类攻击
  • 大数据环境下用户数据隐私安全防护系统的设计与实现(论文+源码)_kaic
  • FPGA常见型号
  • 〔开发系列〕一次关于小程序开发的深度总结
  • es6
  • es的写入过程
  • ES学习笔记(12)--Symbol
  • Golang-长连接-状态推送
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java基本数据类型之Number
  • JSDuck 与 AngularJS 融合技巧
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Logstash 参考指南(目录)
  • node学习系列之简单文件上传
  • vagrant 添加本地 box 安装 laravel homestead
  • 计算机在识别图像时“看到”了什么?
  • 那些年我们用过的显示性能指标
  • 配置 PM2 实现代码自动发布
  • 我感觉这是史上最牛的防sql注入方法类
  • 责任链模式的两种实现
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 智能合约Solidity教程-事件和日志(一)
  • #java学习笔记(面向对象)----(未完结)
  • (~_~)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (全注解开发)学习Spring-MVC的第三天
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (源码分析)springsecurity认证授权
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net(C#)中String.Format如何使用
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @EnableAsync和@Async开始异步任务支持