Java虚拟机之类加载学习总结

abaqus2matlab的安装与使用:如何用matlab提取abaqus的odb结果 官网abaqus2matlab官网地址matlab社区地址matlab社区地址在这里可以看到.m文件的源码论文:Abaqus2Matlab: A suitable tool for finite element post-processingabaqus2matlab可以处理.inp、.fil、.odb三种类型的文件。.inp文件:处理功能就在于只是单纯的输出inp文件,由于我自己写了自己的函数,不需要用到这个功能。 阅读详情

1 什么是类加载

Java 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形可以被虚拟机直接使用的 Java 类型,这个过程被称作虚拟机的类加载机制。

1.1 类加载的应用

在 Java 中类型的加载、连接和初始化过程都是在程序运行期间完成的,为 Java 应用提供了极高的扩展性和灵活性,例如,编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类(例如下面会提到的 SPI 机制);通过Java预置的或自定义类加载器,让某个本地的应用程序在运行时从网络或其他地方上加载一个二进制流作为其程序代码的一部分(JSP、字节码增强)。

1.2 类加载过程

在 Java 中,一个类从定义到使用可以分为加载、验证、准备、解析、初始化、使用以及卸载几个步骤。其中验证、准备和解析又可以统称为连接。

  1. 加载:通过全限定类名查找并加载类的二进制数据,将静态存储结构转化为方法区的运行时数据结构(java.lang.Class 对象);
  2. 验证:确保被加载的类的正确性;
  3. 准备:为类的静态变量分配内存,并将其初始化为默认值;
  4. 解析:把类中的符号引用转换为直接引用;
  5. 初始化:为类的静态变量赋予正确的初始;

1.3 类的验证

验证是连接阶段的第一步,这一阶段的目的是为了确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

1)文件格式验证:此阶段保证输入的字节流能正确地解析并存储于方法区之内,格式上符合描述一个 Java 类型信息的要求。如是否以魔数 0xCAFEBABE 开头,主、次版本号是否在当前虚拟机处理范围之内,常量合理性验证等。

2)元数据验证:此阶段保证不存在不符合 Java 语言规范的元数据信息。如是否存在父类,父类的继承链是否正确,抽象类是否实现了其父类或接口之中要求实现的所有方法,字段、方法是否与父类产生矛盾等。

3)字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。例如保证跳转指令不会跳转到方法体以外的字节码指令上。

4)符号引用验证:在解析阶段中发生,保证可以将符号引用转化为直接引用。

可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。

1.4 类初始化顺序

  1. 父类静态变量/静态初始化块 - 子类静态变量/静态初始化块;
  2. 父类变量/初始化块 - 父类构造器;
  3. 子类变量/初始化块 - 子类构造器。

2 类加载时机

JVM 规范并未对何时进行类加载过程进行强制约束,但 JVM 规范严格规定了有且只有六种情况必须立即对类进行“初始化”,同时保证在此之前完成加载、验证、准备,这六种场景称之为对类的主动使用:

  1. 遇到 new、getstatic、putstatic 或 invokestatic 这四条字节码指令时,如果类型没有进行过初始化,则需要先触发其初始化阶段;
  2. 使用 java.lang.reflect 包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需 要先触发其初始化;
  3. 当初始化类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化;
  4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类;
  5. 当使用 JDK 7 新加入的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial四种类型的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化;
  6. 当一个接口中定义了 JDK 8 新加入的默认方法(被 default 关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。

除此之外,所有引用类的方式都不会触发初始化,称为被动引用,如:

  1. 通过子类引用父类的静态字段,不会导致子类初始化。
  2. 通过数组定义来引用类,不会触发此类的初始化。MyClass[] cs = new MyClass[10];
  3. 常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。

3 类加载器

JVM 团队有意将通过一个类的全限定名来获取描述该类的二进制字节流这个动作放到 JVM 之外实现,以方便程序积极决定如何获取所需要的类。即实现这一动作的代码被称之为类加载器(ClassLoader)。

3.1 类加载分类

类加载器可以分为两种类型,分别是虚拟机自带类加载器和用户自定义类加载器。当 JVM 启动时,会自顶向下形成会形成由三个类加载器组成的初始类加载器层次结构:
在这里插入图片描述

  1. 启动类加载器(BootstrapClassLoader):是嵌在 JVM 内核中的加载器,该加载器是用 C++ 语言编写,主要负载加载 JAVA_HOME/lib 下的类库,启动类加载器无法被应用程序直接使用。
  2. 扩展类加载器(ExtensionClassLoader):该加载器器是用 JAVA 编写,且它的父类加载器是 Bootstrap。主要加载 JAVA_HOME/lib/ext 目录中的类库。也可通过 -Djava.ext.dirs= 参数设置加载路径。
  3. 应用程序类加载器(AppClassLoader):负责加载应用程序 classpath 目录下的所有 jar 和 class 文件。它的父加载器为 ExtClassLoader。

3.2 双亲委派

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(在该类加载的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

看下ClassLoader#loadClass()方法的就能明白 Classloader 是如何通过组合父加载器 来实现双亲委托模型的了:

protected Class<?> loadClass(String name, boolean resolve) {
    synchronized (getClassLoadingLock(name)) {
        // 首先检查类是否已加载
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            // 先尝试通过该加载器的父加载器或启动类加载器加载
            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) {
                // 如果还找不到,调用findClass查找类
                c = findClass(name);
            }
        }
        // 如果是true的话,将该加载器链接到加载的类
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

3.3 自定义类加载器

实现自定义类加载器一般分为两步:一是继承 java.lang.ClassLoader;二是重写父类的 findClass() 方法。除此以外还有两个比较重要的方法:

  1. defineClass():将一个字节数组转换为 Class 类的实例;
  2. loadClass():根据全限定类名找到类,推荐自定义类加载器重写findClass(),而不是当前方法。

实际上,即使我们按如上方法自定义了类加载器,也无法使用自定义类加载器。分析内部调用父类的无参构造函数 super():

protected ClassLoader() {
    this(checkCreateClassLoader(), null, getSystemClassLoader());
}

不难发现当我们实例化一个自定义类加载器的时候如果没有显示指定其父类加载器,默认会使用系统(应用)类加载器作为其父类加载器,又因为双亲委派模型的存在,自定义类加载器会先使用其父类加载器(即AppClassLoader)去加载,而我们自定义类 MyClass是在 classpath
下的,系统类加载器能加载到,所以,最终MyClass的类加载器就是系统类加载器。

为了解决此问题,可以冲几个方面入手:

  1. 重写 loadClass() 方法打破双亲委派模型;
  2. 指定自定义类加载器的父类加载器;
  3. 将需要加载的 class 字节码文件移出父类加载器的扫描范围。

3.4 类加载器的命名空间

对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在 Java 虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。

同时父子类加载器命名空间之间存在一定的可见性关系。

  1. 同一个命名空间内的类是相互可见的;
  2. 子加载器的命名空间包含所有父加载器的命名空间,因此由子加载器加载的类能看见父加载器加载的类(例如系统类加载器加载的类能看见启动类加载器加载的类);
  3. 由父加载器加载的类不能看见子加载器加载的类;
  4. 如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互不可见(通过两个自定加载类对同一个字节码文件加载生成的 Class 对象的 hashCode 是不同的)。

4 打破双亲委派

4.1 线程上下文类加载器

通常情况下,线程执行到某个类的时候,只能看到这个类对应加载器所加载的类。即每个类都会使用自己的类加载器(加载自身的类加载器)来去加载其它类(指所依赖的类),如果classX 引用了 classY,那么 classX 的类加载器就会去加载classY(前提是classY 尚余被加载)。

JDK 1.2 引入线程上下文类加载器,Thread 提供getContextClassLoader() 与setContextClassLoader() 两个方法,如果没有通过 setContextClassLoader 进行设置的话,线程将继承其父线程的上下文类加载器,Java 应用运行时的初始线程的上下文类加载器是应用程序类加载器(AppClassLoader),在线程中运行的代码可以通过该类加载器来加载类与资源。

SPI (Service Provider Interface) 机制就是一个 JAVA 中使用线程上下文类加载器比较典型的例子,是 JAVA 提供的可用于第三方实现和扩展的机制。JDK 定义接口规范,各个厂商根据接口规范实现。接口定义是在 JAVA 核心库中,由启动类加载器加载,上面我们提到一个类都会使用加载自己的类加载器去加载引用的类,而这些接口的实现却来自于不同的 jar 包,放在 classpath 下,对启动类加载器是不可见的,这样传统的双亲委托模型就无法满足SPI 的要求。需要 JAVA 核心类通过线程上下文类加载器(通常是 AppClassLoader)去加载不同的厂商的实现类。通过在 jar 包下的 META-INF/services/xxx(要实现的接口)文件中声明该接口的实现类,就可以通过 ServiceLoader.load(xxx.class) 扫描到然后加载该类。

ref 真正理解线程上下文类加载器(多案例分析)

4.2 自定义类加载器

使用自定义类加载器,重写 loadClass() 方法(注意不是 findClass() 方法)。

但需要注意过滤类名放过需要加载的 JAVA 核心类(如 java.lang.Object),因为这些类无法使用自定义的类加载器加载。

5 类的卸载

JVM 规范中提到可以不要求虚拟机在方法区中实现垃圾收集,因为方法区垃圾收集的“性价比”通常也是比较低的。判定一个类型是否属于“不再被使用的类”的条件就比较苛刻了。需要同时满足下面三个条件:

  1. 该类所有的实例都已经被回收,Java堆中不存在该类及其任何派生子类的实例;
  2. 加载该类的类加载器已经被回收,这个条件除非是经过精心设计,否则通常是很难达成的;
  3. 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

当满足了类卸载的条件后,通过Full GC便可执行类卸载,回收方法区空间。

手把手教你用ZYNQ PS端GPIO模拟SPI驱动OLED屏幕(附Vivado工程) 本文详细介绍了如何利用ZYNQ PS端的EMIO功能,通过GPIO模拟SPI协议驱动SSD1306 OLED屏幕。从Vivado工程配置、SPI协议软件实现到SSD1306驱动开发,提供了完整的解决方案和优化技巧,适合嵌入式开发者快速上手。 阅读详情

相关推荐

window系统 dlib库安装

1. 安装visual studio 1.1. 安装vs2017或以上版本 1.2. 我们需要安装使用C++的桌面开发,且必须选上用于Cmake的Visual C++工具 1.3. 安装完成后,将D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin 添加到环境变量PATH中 2 下载cmake文件,并添加环境变量 2.1 在c

@bangbang的博客 815

Java虚拟机——类文件结构

魔数不仅是Class文件,很多文件格式标准中都使用魔数来进行身份识别的习惯,例如GIF或者JPEG等的文件头。方法中的代码,经过Javac编译器编译成字节码指令之后,存放在方法属性表集合中的一个名为"Code"的属性里面。如文本字符串、被声明为final的常量值等。常量池中每一项常量都是一个表,截至JDK13,常量表中已经有了17种不同类型的常量。不同常量类型有着各自完全独立的数据结构,并且它们在常量池中占据的字节大小也是不一样的。它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。

肇秋贰拾捌的博客 506

期货缠论实战:文华财经笔中枢指标公式解析与博易大师应用指南

本文深入解析期货缠论实战中的文华财经笔中枢指标公式及其在博易大师平台的应用技巧。详细介绍了笔中枢指标的核心逻辑、公式拆解、参数设置及多周期联合作战策略,帮助交易者提升市场分析能力与交易胜率。特别适合期货交易者学习缠论指标的实际应用。

weixin_42522552的博客 357

java 虚拟类_java虚拟机如何理解类类型?

谢邀众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么。正是得益于Java虚拟机,它号称的“一次编译,到处运行”才能有所保障。1.1 Java程序执行流程Java程序的执行依赖于编译环境和运行环境。源码代码转变成可执行的机器代码,由下面的流程完成:Java技术的核心就是Java...

weixin_33733742的博客 984

AHB2eflash 控制器设计笔记

① SRAM② DRAM③ SSD④ SATA⑤ U 盘⑥ 移动硬盘⑦ 机械磁盘eflash。

weixin_46220498的博客 3078

KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解

在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩

weixin_42519985的博客 251

Java FileChannel虚拟类

文章目录总结FileChannel虚拟类方法打开文件选项 总结 FileChannel虚拟类方法 方法名 作用 static FileChannel open(Path path, Set<? extends OpenOption> options, FileAttribute<?>… attrs) 打开或创建文件,返回访问该文件的文件通道。 path是要打开或创建的文件路径和文件名,options打开文件选项,

weixin_45754452的博客 858

AMBA-CHI协议详解(二)

读事务,写事务,原子事务,Stash事务,Dataless事务,DVM事务,Retry事务。

Crazzy_M的博客 6652

Java ClassLoader 虚拟类实现代码热替换

Java ClassLoader 虚拟类实现代码热替换,极简实现

weixin_45754452的博客 1178

OpenCV自学记录(1)——(一拳超人)图像处理基础(图像获取、图像变化)

学习深度学习进行图像分类和目标检测时,要有一定的图像处理的基础。在学习深度学习之前,看了一本《图像处理技术基础》,现在也忘得差不多了,后悔当初没有整理记录下来。现在整理一下图像处理的常用方法,最后实现一个小项目——基于OpenCV的车牌号识别。 OpenCV自学记录(1)——图像处理基础(一)1、图像获取1.1获取图像数据1.2 获取摄像头图像数据2、图像变化2.1 移动(translation)...

qq_40784418的博客 1455

SDA 还是 SDI:SAP HANA 数据虚拟化与数据集成的取舍、组合与实战

结论先放在前面:SDA 面向数据虚拟化与联邦查询,强调不落地、不复制、按需实时访问;SDI 面向数据集成与复制,强调抽取、转换、装载与近实时增量同步。两者共享 Remote Source 与 Adapter 的理念,但侧重点与运行时组件明显不同。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 585

通俗易懂的Java虚拟机类加载

Java虚拟机将定义类的信息从Class文件加载到内存,并对信息进行校验、解析和初始化,最终形成可以被Java虚拟机直接使用的Java类型,这就是Java虚拟机的类加载过程。

StoNENee的博客 362

C# HttpClient完全攻略:从入门到精通只需5步

HttpClient是.NET框架中用于发送HTTP请求和接收HTTP响应的类。它基于异步编程模型,使得网络操作更加高效和灵活。

java专栏 1579

JAVA虚拟机初步学习之类的加载

类的生命周期 了解类的加载过程,我们先说一下,类的整个生命周期吧。 类的生命周期有七个阶段:加载阶段,验证阶段,解析阶段,准备阶段,初始化阶段,使用阶段,卸载。 流程如下: 类的加载 首先类的加载和类的生命周期中提到的加载阶段不是同一个概念,不要混淆了。 类的加载的定义: JVM把描述类的数据从class文件中加载到内存,对数据进行校验,转化解析和初始化,最终形成可以

u014183483的专栏 254

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JAVA虚拟机学习笔记之类加载过程

1、类加载定义:虚拟机把描述类的class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程 2、类在虚拟机中的生命周期:Loading(加载)-&gt;Verification(验证)-&gt;Preparation(准备)-&gt;Resolution(解析)-&gt;Initialization(初始化)-&gt;Using(使用)-&gt;...

m0_37847185的博客 171

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java虚拟机学习之类加载机制将

一、什么是类的加载机制 1、虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 2、类的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高灵活性。 3、Java里天生可以动态扩展的语言特性就是依赖云溪区动态加载和动态链接这个特点实现的。例如编

LiQiyao的博客 347

《深入理解Java虚拟机》学习笔记之类加载及类加载器

类加载机制:Java虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 类加载的时机 加载阶段合适开始,《Java虚拟机规范》并没有强制约束,交由虚拟机自己实现。 而初始化阶段,严格规定有且只有以下六种情况,如果类型没有进行过初始化,必须对类进行初始化: 遇到以下字节码指令: new:实例化对象的时候 getstatic和putstatic,读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字

天乔巴夏丶 181

JAVA虚拟机学习笔记之类加载机制

一、JVM类加载机制 1、JVM系统加载器:Bootstrap ClassLoader(c++实现,程序不可见)-&gt;ExtClassLoader-&gt;SystemClassLoader 2、Bootstrap ClassLoader 启动类加载器(加载jre/lib目录下指定jar) 3、ExtClassLoader 扩展类加载器(加载jre/lib/ext目录) 4、SystemCla...

m0_37847185的博客 180

java虚拟机学习记录之类加载(一)加载机制

时隔一年多又重新翻阅了一边j&lt;深入理解java虚拟机&gt; 一书对其写的知识又了更好的认识,所以决定做下笔记。作为java开发者虚拟机好多的技术和理论我们只需要知道皮毛即可,但是个人觉得有些知识作为程序员还是必须要知道的。类加载机就是我们必须掌握之一。类加载时间虚拟机开始加载类开始,到卸载为止,是整个的生命周期。流程包括 类加载-----&gt;验证-----&gt;准备-----&gt;...

wzn博客 163

《深入理解Java虚拟机》学习笔记之类加载机制总结

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。如下图: 类加载的7个阶段已经知道了,那什么情况下需要开始类加载过程的

seabear008的专栏 888

Java虚拟机学习之类加载器与双亲委派

类加载器:Class Loader 作用:加载class文件 虚拟机(用户)自带的加载器 启动类(根)加载器Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。 扩展类加载器ExtClassLoader(1.9之后更名为PlatformClassLoader):主要负责加载jre/lib/ext目录下的一些扩展的jar; 应用程序加载器APPClassLoader:主要负责加载应用程序的主函

w_slin的博客 98

《深入理解Java虚拟机》学习笔记之类加载

之前在学习ASM时做了一篇笔记《Java字节码操纵框架ASM小试》,笔记里对类文件结构做了简介,这里我们来回顾一下。 Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把Java的规范拆分成了Java语言规范和Java虚拟机规范。而Java可以跨平台主要是靠不同平台的虚拟机来实现的,而在不同平台的虚拟机使用了统一的程序储存格式——字节码(ByteCode)即Class文件。 ...

weixin_30670965的博客 94

《深入理解Java虚拟机》学习笔记之类加载机制

定义: 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制 过程: 在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的 优点:高度的灵活性。Java中可以动态扩展的语言特性就是依赖 运行期间动态加载和动态连接 这个特点实现的 缺点:类加载时的性能开销。 ...

吃了么没吃回家吃点儿 213

深入Java虚拟机之类加载

深入Java虚拟机_ClassLoader 类加载器深入剖析 Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机将结束生命周期 执行了System.exit()方法程序正常执行结束程序在执行过程中遇到了异常或错误而异常终止由于操作系统出现错误而导致Java虚拟机进程 类的加载连接和初始化 加载:查找并加载类的二进制数据 连

前往JAVA架构的路上 3万+

Java虚拟机(JVM)之类的加载过程详解

java程序在对某个类进行引用、使用时,就会开始对该类进行加载,比如直接使用类加载器进行显式加载、创建该类的对象、使用该类的类变量等情况。类的加载是通过java虚拟机的类加载子系统完成的。类的加载主要分为三个阶段。 类的加载步骤 类加载子系统负责从文件系统或者网络上加载class文件,class文件在文件开头会有特定的文件标志。 ClassLoader只负责class文件的加载,至于他是否可以运行,则有执行引擎决定。 加载的类信息存放在一块称为方法区的内存空间中,除了类信息外,方法区还会存放运行时常量池

qq_40837310的博客 2507

虚拟机类加载机制之类加载过程

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。

ningkangming的博客 824

Java基础之类加载器

Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序。本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式(双亲委派模式),然后介绍了几种常见的类加载器及其适用场景,最后则一个例子展示了如何自定义类加载器。 基本概念 基本文件类型和概念 常见概念介绍: java源文件(.java):.java是Java的源文件后缀,里面存放程序员编写的功能代码,只是一个文本文件,不能被java虚拟机所识别, 但是java语法有

m0_68064743的博客 1万+
上一篇: 既然有了ES,为何还用ClickHouse——从原理万字总结ClickHouse为何这么快
下一篇: 面试官:你能说出几种常见的限流算法?
程序猿周周
程序猿周周 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄10年 1万+粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿周周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值