JVM类加载器

devtools/2025/1/8 8:09:10/

什么是类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。
类加载器只参与加载过程中的字节码获取并加载到内存这一部分

类加载器的分类

  • 类加载器分为两类,一类是Java代码中实现的,一类是Java虚拟机底层源码实现的。
    • 加载程序运行时的基础类
    • 继承自抽象类ClassLoader
  • JDK8及之前的版本中默认的类加载器有如下几种
    • 启动类加载器Bootstrap-加载Java中最核心的类
    • 扩展类加载器Extension-允许扩展Java中比较通用的类
    • 应用程序类加载器Application- 加载应用使用的类

通过启动类加载器去加载用户jar包:

启动类加载器(BootstrapClassLoader)是由Hotspot虚拟
默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,

  • 放入jre/lib下进行扩展
    不推荐,尽可能不要去更改JDK安装目录中的内容,会出现即时放进去由于文件名不匹配的问题也不会正常地被加载
  • 使用参数进行扩展
    推荐,使用-Xbootclasspath/a:jar包目录/jar包名进行扩展

扩展类加载器Extension

扩展类加载器和应用程序类加载器都是JDK中提供的、使用Java编写的类加载器。

  • 扩展类加载器(Extension Class Loader)是JDK中提供的默认加载Java安装目录/jre/lib/ext下的类文件。
  • 在这里插入图片描述
  • 通过扩展类加载器去加载用户jar包
    • 放入/jre/lib/ext下进行扩展
    • 使用参数进行扩展
      推荐,使用-Djava.ext.dirs=jar包目录进行扩展,这种方式会覆盖掉原始目录,可以用;(windows):(macos/linux)追加上原始目录

应用程序类加载器Application

加载classpath下的类文件(也会加载ext 及启动类加载器不加载的相关 跟双亲委派有关)

Arthas中类加载器相关的功能 查看类加载器加载了什么jar

  • 类加载器的加载路径可以通过classloader–c hash值查看
    可以看到扩展类加载器加载的目录在这里插入图片描述

类加载器的双亲委派机制

双亲委派机制指的是:自底向上查找是否加载过,再由顶向下进行加载。
在这里插入图片描述

双亲委派机制有什么用?

  • 1.保证类加载的安全性
  • 2.避免重复加载

打破双亲委派机制

自定义类加载器

  • 先来分析ClassLoader的原理,ClassLoader中包含了4个核心方法。
  • 双亲委派机制的核心代码就位于loadClass方法中。
  • 正确的去实现一个自定义类加载器的方式是重写findClass方法,这样不会破坏双亲委派机制在这里插入图片描述
  • 双亲委派机制核心代码阅读
//parent等于null说明父类加载器是启动类加载器,直接调用findBootstrapClassOrNull
//否则调用父类加载器的加载方法
protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

http://www.ppmy.cn/devtools/148470.html

相关文章

新零售模式下开源AI智能名片2+1链动模式S2B2C商城小程序源码的应用研究

摘要&#xff1a;新零售作为线上线下零售融合的新型商业模式&#xff0c;正在逐步改变传统零售业的面貌。然而&#xff0c;小型门店在SKU管理、供应商管理、运营效率等方面仍面临诸多挑战。本文旨在探讨开源AI智能名片21链动模式S2B2C商城小程序源码在新零售中的应用&#xff0…

DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

最近&#xff0c;DeepSeek v3&#xff08;一个MoE模型&#xff0c;拥有671B参数&#xff0c;其中37B参数被激活&#xff09;模型全球爆火。 作为一款能与Claude 3.5 Sonnet&#xff0c;GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源&#xff0c;还放出一份扎实的技术…

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之11 方案再探之2 项目文件(修改稿1)

(以下内容是第二次重建项目&#xff08;“方案再探”&#xff09;时的项目附件。) 为AI聊天工具添加一个知识系统 Part1 人性化&去中心化 前情提要 这一次我们暂时抛开前面对“智能工厂的软件设计”的考虑--其软件智能 产品就是 应用程序。直接将这些思维方式和方法论 运…

vue3使用echarts

遇到的问题&#xff0c;&#xff0c;&#xff0c;vue3中使用 tooltip:{trigger:"axis"} ,鼠标移动上去不展示数字 vue3中使用 tooltip:{trigger:"axis"} 悬浮提示框消失了&#xff0c;&#xff0c; /* 首先引入 markRaw */ /* markRaw就是把某个数据&…

气膜球幕:引领元宇宙时代的科技与艺术光影盛宴—轻空间

在科技与艺术交织的时代&#xff0c;未来的观影体验将不再受限于传统屏幕的束缚。随着气膜球幕的崭新亮相&#xff0c;突破性的光影效果和沉浸式体验让我们走进了一个全新的视听世界。这不仅仅是一个简单的球形影院&#xff0c;它是连接现实与虚拟、科技与艺术、光与影的桥梁&a…

Ajax阶段总结(二维表+思维导图+四种请求方式)

1. 引言 经过两个半星期的学习&#xff0c;也算是给ajax结了个尾。总之自己的学习速度和其他人相比&#xff0c;仅仅是差不多&#xff0c;并没有快出来&#xff0c;所以仍需要继续加把劲。 下面是我的学习过程中的二维表和思维导图以及一个简单的案例&#xff0c;希望大家能够获…

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…

构建现代化的AI流水线:从数据处理到模型部署

人工智能&#xff08;AI&#xff09;的快速发展促使越来越多的开发者关注如何快速、有效地从数据中提取价值。然而&#xff0c;从数据处理到模型部署&#xff0c;这一过程涉及多个复杂步骤。本篇文章旨在介绍构建现代化AI流水线的主要环节&#xff0c;并详细探讨一种常用技术的…