高薪程序员必修课-java中 类加载器以及JVM类加载机制

news2024/11/20 0:35:59

前言

        在Java中,类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,负责将.class文件加载到内存中并生成对应的Class对象。类加载器的主要任务是动态加载Java类,即在程序运行时根据需要加载类,而不是在编译时就全部加载。

JVM类加载机制

JVM的类加载机制遵循一定的规则和顺序,主要包括以下几个步骤:

  1. 加载(Loading)

    加载阶段是指查找并加载类的二进制数据(.class文件)到JVM中的内存中。加载类的任务由类加载器完成,JVM内置了三个主要的类加载器:

    • Bootstrap ClassLoader:也称为引导类加载器,负责加载JVM自身需要的类,如java.lang.Object等核心类库,它是JVM的一部分,通常用本地代码实现,无法直接在Java代码中获取到。

    • Extension ClassLoader:扩展类加载器,负责加载JVM扩展目录(<JAVA_HOME>/lib/ext目录)中的类库。在Java中可以通过ClassLoader.getSystemClassLoader().getParent()获取到扩展类加载器。

    • System ClassLoader:也称为应用程序类加载器,负责加载应用程序classpath下的类,即开发者自己编写的类。在Java中可以通过ClassLoader.getSystemClassLoader()获取到应用程序类加载器。

  2. 链接(Linking)

    链接阶段包括三个子阶段:

    • 验证(Verification):确保加载的类符合JVM规范,如字节码验证,验证类文件是否有效。

    • 准备(Preparation):为类的静态变量分配内存,并设置默认初始值(零值)。

    • 解析(Resolution):将类中的符号引用替换为直接引用,即转化为可以直接使用的内存地址。

  3. 初始化(Initialization)

    初始化阶段是类加载的最后一个阶段,负责执行类变量的初始化和静态代码块的执行。初始化类的条件包括:

    • 创建类的实例。
    • 访问类的静态变量或静态方法。
    • 初始化类的子类。

    类的初始化是按照初始化顺序执行静态变量和静态代码块,且只会执行一次。

  4. 使用(Using)

    在使用阶段,类被实际使用,包括创建对象、调用方法等操作。

  5. 卸载(Unloading)

    类卸载阶段是指JVM在满足一定条件时,卸载不再需要的类,释放相关的内存空间。类卸载的条件包括类的实例都已经被GC回收,并且该类的ClassLoader也没有被引用。

类加载器(ClassLoader)

类加载器是Java的一个重要概念,它负责加载Java类到内存中,并生成对应的Class对象。类加载器根据不同的加载需求和类路径,将类加载到JVM中,它的主要特点包括:

  • 双亲委派模型:JVM采用双亲委派模型来组织类加载器。即当一个类加载器接收到加载类的请求时,它会先委托给父类加载器加载,只有在父类加载器无法完成加载时,子类加载器才会尝试加载。这样可以保证类的加载顺序和避免重复加载。

  • 类加载器层次:JVM中的类加载器形成了层次结构,从而形成了加载类的优先级。Bootstrap ClassLoader位于顶层,Extension ClassLoader和System ClassLoader位于其下,开发者可以根据需要自定义ClassLoader来加载类。

  • 自定义类加载器:开发者可以通过继承ClassLoader类来自定义类加载器,以实现特定的加载需求,如从网络中加载类、加密类加载等。

示例

以下是一个简单的自定义类加载器示例,用于从指定路径加载类:

public class CustomClassLoader extends ClassLoader {
    private String classPath;

    public CustomClassLoader(String classPath) {
        this.classPath = classPath;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            byte[] data = loadClassData(name);
            return defineClass(name, data, 0, data.length);
        } catch (IOException e) {
            throw new ClassNotFoundException(name);
        }
    }

    private byte[] loadClassData(String className) throws IOException {
        String fileName = classPath + File.separatorChar + className.replace('.', File.separatorChar) + ".class";
        try (InputStream ins = new FileInputStream(fileName)) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
            int bytesNumRead;
            while ((bytesNumRead = ins.read(buffer)) != -1) {
                baos.write(buffer, 0, bytesNumRead);
            }
            return baos.toByteArray();
        }
    }

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        String classPath = "/path/to/classes";
        CustomClassLoader loader = new CustomClassLoader(classPath);
        Class<?> clazz = loader.loadClass("com.example.MyClass");
        Object obj = clazz.newInstance();
        // 使用加载的类实例
    }
}

总结

        类加载器和JVM类加载机制是Java语言动态性和灵活性的基础之一。了解类加载的过程、类加载器的种类和工作原理,对于深入理解Java的类加载机制和解决类加载问题至关重要。

⭐️⭐️ ⭐️ ⭐️ ⭐️ 好书推荐
《Java项目开发全程实录》(第4版)

【内容简介】

        《Java项目开发全程实录(第4版)》以企业QQ、蓝宇快递打印系统、开发计划管理系统、酒店管理系统、图书馆管理系统、学生成绩管理系统、进销存管理系统、神奇Book—图书商城、企业门户网站、棋牌游戏系统之网络五子棋10个实际项目开发程序为案例,从软件工程的角度出发,按照项目的开发顺序,系统、全面地介绍了J2SE和J2EE项目的开发流程。从开发背景、需求分析、系统功能分析、数据库分析、数据库建模、网站开发和网站发布或者程序打包与运行方面进行讲解,每一过程都进行了详细的介绍。

📚 京东购买链接:Java项目开发全程实录(第4版)icon-default.png?t=N7T8https://u.jd.com/5QShvEG

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1896239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刚办理的手机号被停用,你可能遇到这些问题了!

很多朋友都会遇到手机号被停用的情况&#xff0c;那么你知道你的手机号为什么会被停用吗&#xff1f;接下来&#xff0c;关于手机号被停用的问题&#xff0c;跟着小编一块来了解一下吧。 ​停机的两种形态&#xff1a; 1、第一个是局方停机&#xff0c;即语音、短信和流量都不…

Amazon SageMaker 机器学习之旅的助推器

一、前言 在当今的数字化时代&#xff0c;人工智能和机器学习已经成为推动社会进步的重要引擎。亚马逊云科技在 2023 re:Invent 全球大会上&#xff0c;宣布推出五项 Amazon SageMaker 新功能&#xff1a; Amazon SageMaker HyperPod 通过为大规模分布式训练提供专用的基础架构…

香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别

OrangePi AIpro 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;自发布以来就引起了我的极大关注。其配备的8/20TOPS澎湃算力&#xff0c;堪称目前开发板市场中的顶尖性能&#xff0c;实在令人垂涎三尺。如此强大的板子&#xff0c;当然要亲自体验一番。今天非常荣幸地拿到…

Kubernetes基于helm安装 harbor

Kubernetes基于helm安装 harbor 之前harbor的安装都是借助docker完成一键安装部署&#xff0c;安装完成之后harbor组件均运行到一台机器上面&#xff0c;本文实践harbor在k8s环境中的部署。 准备工作 根据harbor官方要求&#xff1a; Kubernetes cluster 1.20Helm v3.2.0 …

kkFileView一款好用开源免费的文件在线预览项目

在这个数字化时代&#xff0c;我们每天都要跟各种文件打交道&#xff0c;但很多时候&#xff0c;文件预览却成了个头疼的问题&#xff0c;很多时候我们都希望能够在不下载文件的情况下&#xff0c;快速查看文件内容。 今天开源君就来分享一款文件在线预览项目 - kkFileView&am…

编译rust程序,并让它依赖低版本的GLIBC库

目录 方法一&#xff1a;在较低版本的linux系统里面编译更新centos源安装 gcc 方法二&#xff1a;静态编译 在linux环境下编译rust程序&#xff0c;编译好的程序会依赖你当前系统的GLIBC库&#xff0c;也就是说你的程序无法在使用更低版本GLIBC库的linux系统中运行。 查看当前系…

Java案例:完成用户登录

一案例要求&#xff1a; 二代码实现&#xff1a; Ⅰ package 重修;import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {javabean s1new javabean("张世杰","5201314");Scanner scnew Scan…

【Linux】Linux常用指令合集精讲,一篇让你彻底掌握(万字真言)

文章目录 一、文件与目录操作1.1 ls - 列出目录内容1.2 cd - 切换目录1.3 pwd - 显示当前目录1.4 mkdir - 创建目录1.5 rmdir - 删除空目录1.6 rm - 删除文件或目录1.7 cp - 复制文件或目录1.8 mv - 移动或重命名文件或目录1.9 touch - 创建空文件或更新文件时间戳 二、文件内容…

日期选取限制日期范围antdesign vue

限制选取的日期范围 效果图 <a-date-pickerv-model"dateTime"format"YYYY-MM-DD":disabled-date"disabledDate"valueFormat"YYYY-MM-DD"placeholder"请选择日期"allowClear />methods:{//回放日期选取范围限制&…

nginx 搭理禅道

1.安装nginx。 2.安装禅道。 3.nginx 配置文件 location /zentao/ { proxy_pass http://192.168.100.66/zentao/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-F…

论文解读StyleGAN系列——StyleGANv3

论文&#xff1a;Alias-Free Generative Adversarial Networks&#xff08;2021.06&#xff09; 作者&#xff1a;Tero Karras, Miika Aittala, Samuli Laine, Erik Hrknen, Janne Hellsten, Jaakko Lehtinen, Timo Aila 链接&#xff1a;https://arxiv.org/abs/2106.12423 代码…

高效使用 Guzzle:POST 请求与请求体参数的最佳实践

介绍 在现代爬虫技术中&#xff0c;高效发送 HTTP 请求并处理响应数据是关键步骤之一。Guzzle 是一个强大的 PHP HTTP 客户端&#xff0c;广泛应用于发送同步和异步请求。本文将介绍如何使用 Guzzle 发送 POST 请求&#xff0c;特别是如何传递请求体参数&#xff0c;并结合代理…

Windows 网络发现是什么意思?如何启用?

什么是 Windows 网络发现 Windows 网络发现是一项使计算机能够在本地网络中发现并与其他设备通信的功能。通过网络发现&#xff0c;用户可以在网络上轻松找到和访问其他计算机、打印机和共享资源。这对于家庭网络和小型办公室环境尤为重要&#xff0c;因为它简化了设备互联和资…

【RAG检索增强生成】MaxKB:构建企业级知识库问答系统(Ollama+Qwen2)

目录 引言1、MaxKB概述1.1 定义与目标1.2 特点与优势 2、MaxKB原理3、MaxKB架构4、基于MaxKBOllamaQwen2搭建本地知识库4.1 环境准备4.2 部署MaxKB4.3 部署Ollama4.4 部署运行qwen24.5 知识库配置4.5.1登录 MaxKB 系统4.5.2上传文档4.5.3设置分段规则 4.6 模型配置4.7 创建应用…

pytest-yaml-sanmu(七):使用fixture返回值

fixture 是 pytest 中非常重要的功能&#xff0c;大部分项目都可能会用到 fixture。 pytest 的内置标记 usefixtures 可以帮助用例自动的使用 fixture 1. 创建 fixture pytest 中的 fixtures 大致有两个用途 在用例执行之前、执行之后&#xff0c;自动的执行 通过 fixture …

如何在Qt使用uchardet库

如何在 Qt 中使用 uchardet 库 文章目录 如何在 Qt 中使用 uchardet 库一、简介二、uchardet库的下载三、在Qt中直接调用四、编译成库文件后调用4.1 编译工具下载4.2 uchardet源码编译4.3 测试编译文件4.4 Qt中使用 五、一些小问题5.1 测试文件存在的问题5.2 uchardet库相关 六…

Linux关于文件的高级命令

tree命令 tree命令用于以树状图的形式显示目录结构。它可以帮助用户快速了解目录和文件的层次关系&#xff0c;非常适合用于浏览和理解大型文件系统的结构。 基础用法 显示当前目录的树状结构&#xff1a;tree 显示指定目录的树状结构&#xff1a;tree 指定目录路径 tree命…

比尔・盖茨谈AI市场狂热现象;腾讯推出TransAgents文学翻译框架

&#x1f989; AI新闻 &#x1f680; 比尔・盖茨谈AI市场狂热现象 摘要&#xff1a;微软联合创始人比尔・盖茨在《下一个伟大的构想》播客节目中表示&#xff0c;目前AI市场的狂热程度远超互联网泡沫&#xff0c;准入门槛低&#xff0c;融资额巨大&#xff0c;处于前所未见的…

大华设备接入GB28181视频汇聚管理平台EasyCVR安防监控系统的具体操作步骤

智慧城市/视频汇聚/安防监控平台EasyCVR兼容性强&#xff0c;支持多协议接入&#xff0c;包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等&#xff0c;并能对外分发RTMP、…

高效批量调整视频色彩:一键实现视频饱和与色度优化,提升视觉体验

在数字时代&#xff0c;视频已成为我们记录生活、分享故事的重要工具。然而&#xff0c;你是否曾因为视频色彩不够饱满、色度不够鲜明而感到困扰&#xff1f;今天&#xff0c;我要为你介绍一款神奇的软件——它能让你的视频色彩焕然一新&#xff0c;提升视觉体验&#xff0c;它…