JVM工作原理与实战(九):类加载器-启动类加载器

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、启动类加载器

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

1.放入jre/lib目录进行扩展

2.使用参数进行扩展

总结


前言

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了启动类加载器、通过启动类加载器去加载用户jar包等内容。


在Java虚拟机(JVM)中,类加载器负责将类的字节码文件加载到内存中,并生成对应的Class对象。类加载器是Java虚拟机中的重要组成部分,而启动类加载器(Bootstrap ClassLoader)则是其中最核心的类加载器。

一、启动类加载器

启动类加载器是由Hotspot虚拟机提供的,使用C++编写,是Java类加载器中的顶级类加载器。它的主要职责是加载Java的核心类库,如rt.jar、resources.jar和tools.jar等。这些核心类库包含了Java语言的核心类,如String等。

默认加载的是Java安装目录/jre/lib下的类文件:

在实际应用中,程序员通常会使用ClassLoader来动态加载第三方类库,或者实现自己的类加载器来满足特定的需求。ClassLoader提供了许多方法来动态加载类,如loadClass()、defineClass()等。这些方法允许程序员在运行时动态地加载类的字节码文件,并生成对应的Class对象。

但是由于启动类加载器位于虚拟机的环境中,而不是在应用程序的代码中,因此程序员无法直接获取到启动类加载器。这是出于安全性的考虑,因为启动类加载器是Java核心类库的加载器,如果允许应用程序代码获取到启动类加载器的引用,可能会被恶意代码利用来加载或修改Java核心类库,导致安全风险。因此,程序员无法在代码中获取到启动类加载器,也无法对其进行操作,这也是为了保证Java虚拟机的安全性和稳定性。

案例:

尝试获取启动类加载器(String类位于JDK下rt.jar包中):

public class BootstrapClassLoaderDemo {public static void main(String[] args) throws IOException {ClassLoader classLoader = String.class.getClassLoader();System.out.println(classLoader);}
}

运行结果(无法获取该启动类加载器):

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

在JDK中,类加载器是负责动态加载Java类到JVM中的机制。启动类加载器作为类加载器层次结构的最顶层,负责加载包括java.lang包在内的核心API类。当开发者需要添加或扩展核心类时,必须通过特定的方式来进行。

1.放入jre/lib目录进行扩展

一种直接的方法是将所需的jar包放入JRE/Lib目录下,让启动类加载器能够加载到这个jar包中的类,然而,这种方法并不推荐。主要原因在于,对JDK安装目录中的内容进行更改可能导致不稳定性以及其他未预期的问题。其次,可能会出现因为文件名不匹配而导致无法正常加载的情况发生。

2.使用参数进行扩展

为了更加灵活和可控地扩展JDK,推荐使用命令行参数进行配置。具体来说,可以使用-Xbootclasspath/a:jar包目录/jar包名来指定额外的jar包供启动类加载器加载。这种方式的好处在于,它允许开发者在不更改JDK安装内容的情况下进行扩展,从而保持JDK环境的稳定性。

-Xbootclasspath/a:jar包目录/jar包名

案例:

public class Test {static {System.out.println("Test初始化");}
}

将该项目打成jar包:

运行结果:

放到目录下:

添加-Xbootclasspath/a:jar包目录/jar包名参数:

-Xbootclasspath/a:jar包目录/jar包名

加载jar包:

public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {Class<?> aClass = Class.forName("com.rye.test.Test");System.out.println(aClass);}
}

运行结果:

获取该类的类加载器:

public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {Class<?> aClass = Class.forName("com.rye.test.Test");System.out.println(aClass);ClassLoader classLoader = aClass.getClassLoader();System.out.println(classLoader);}
}

获取结果(无法获取启动类加载器):

对于需要进行核心类扩展的情况,推荐使用命令行参数的方式进行配置,而不是直接修改JDK安装目录的内容。这样可以确保环境的稳定性和避免潜在的类加载问题。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了启动类加载器、通过启动类加载器去加载用户jar包等内容,希望对大家有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化器(一)torch.optim.SGD-随机梯度下降法

torch.optim.SGD-随机梯度下降法 import torch import torchvision.datasets from torch import nn from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR10(root./data, trainFalse, downloadTrue,transformtorchvision.transforms.ToTensor()) data…

RK3399平台入门到精通系列讲解(实验篇)自定义工作队列的使用

🚀返回总目录 文章目录 一、自定义工作队列介绍1.1、工作队列相关结构体1.2、工作队列相关接口函数二、自定义共享队列案例2.1、Makefile2.2、驱动案例共享队列是由内核管理的全局工作队列,自定义工作队列是由内核或驱动程序创建的特定工作队列,用于处理特定的任务。 一、…

华为mstp、vrrp、ospf、isis、bgp等综合一起排错

最终实现左边私网和右边私网全部ping通 SW1 vlan batch 12 34 stp region-configuration //mstp配置 region-name test instance 12 vlan 12 instance 34 vlan 34 active region-configuration interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass …

求更新后的路由表

假定网络中的路由器B的路由表有如下的项目 (这三列分别表示“目的网络“距离”和“下一跳路由器”): 现在B收到从C发来的路由信息(这两列分别表示“目的网络”和“距离”): 试求出路由器B更新后的路由表(详细说明每一个步骤)。 (1)首先把收到的路由信息的"距离"1: …

[论文阅读] Revisiting Feature Propagation and Aggregation in Polyp Segmentation

[论文地址] [代码] [MICCAI 23] Abstract 息肉的准确分割是筛查过程中有效诊断结直肠癌的关键步骤。 由于能够有效捕获多尺度上下文信息&#xff0c;普遍采用类似UNet 的编码器-解码器框架。 然而&#xff0c;两个主要限制阻碍了网络实现有效的特征传播和聚合。 首先&#xff…

我的创作纪念日——redis的历史纪录

机缘 最开始只想存留点Redis的操作信息&#xff0c;后来写着写着也就写多了&#xff0c;虽然后面很长时间由于忙就没继续写&#xff0c;但是还是偶尔登录看一下&#xff0c;有好几篇文章的浏览量还是很多的呢。 收获 收获不多&#xff0c;粉丝也才三十多个&#xff0c;浏览量感…

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务&#xff0c;管理起来非常简单&#xff0c;但…

【100个Cocos实例】通过重写源码实现循环PageView

引言 Cocos中通过重写源码实现循环PageView 大家好&#xff0c;有小伙伴私信我&#xff1a; 有没有办法实现循环的PageView列表的方法呢 本文将介绍一下Cocos中通过重写源码实现循环PageView。 本文源工程可在文末阅读原文获取&#xff0c;小伙伴们自行前往。 1.什么是Page…

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具&#xff0c;用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

景联文科技GPT教育题库:AI教育大模型的强大数据引擎

GPT-4发布后&#xff0c;美国奥数队总教练、卡耐基梅隆大学数学系教授罗博认为&#xff0c;这个几乎是用“刷题”方式喂大的AI教育大模型的到来&#xff0c;意味着人类的刷题时代即将退出历史舞台。 未来教育将更加注重学生的个性化需求和多元化发展&#xff0c;借助GPT和AI教育…

工厂方法模式(Factory Method)

文章目录 定义与类型适用场景优点缺点工厂方法代码示例 定义与类型 定义&#xff1a;定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。 类型&#xff1a;创建型。 适用场景 创建对象需要大量重复的代码…

mysql视图和sql语句

mysql视图和sql语句 一.mysql视图1.数据的虚拟表示&#xff1a;2.简化复杂查询&#xff1a;3.安全性和权限控制&#xff1a;4.逻辑数据组织&#xff1a;5.更新限制&#xff1a;6.视图的创建&#xff1a; 二.mysq语句使用案列 MySQL的视图&#xff08;View&#xff09;是一个虚拟…

如何向嵌入式设备中添加tcpdump工具

说明&#xff1a;tcpdump是一个在网络设备调试中一个非常重要的工具&#xff0c;它并不像hexdump等工具集成在busybox里面&#xff0c;也不像其他的软件一样只需要依赖linux标准的库就可以实现&#xff0c;它需要pcap相关的库和加密的相关库。 本文主要是基于realtek 83系列的…

[VUE]5-TypeScript

目录 1 TypeScript 介绍2、安装3、快速上手4、TypeScript 常用类型4.1 类型标注的位置4.2 字符串、数字、布尔类型4.3 字面量类型4.4 ⭐interface 类型4.5 class 类型 ​&#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;…

三、Qt核心与Qt类库

一、Qt核心&#xff1a;元对象系统 1、Qt核心特点 Qt对标准C进行了扩展&#xff0c;引入了一些新的概念和功能元对象编译器&#xff08;MOC&#xff09;是一个预处理器&#xff0c;先将Qt的特性程序转为标准C程序&#xff0c;再由标准C编译器进行编译Qt为C语言增加的特性在Qt…

LeetCode第32题 : 最长有效括号

题目介绍 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()" 示例 2&#xf…

【Python机器学习】线性模型——用于多分类的线性模型

很多线性分类模型只使用与二分类问题&#xff0c;将二分类算法推广到多分类算法的一种常见方法是“一对其余”方法。在“一对其余”方法中&#xff0c;对每个类别都学习一个二分类模型&#xff0c;将这个类别和其他类别尽量区分&#xff0c;这样就生成了与类别数相同的二分类模…

设计模式——最全梳理,最好理解

新年献礼&#xff01; 设计模式呕心梳理 创建型模式 单例模式&#xff08;Singleton Pattern&#xff09;https://blog.csdn.net/qq_34869143/article/details/134874044 整理中... 结构型模式 代理模式&#xff08;Proxy Pattern&#xff09;https://blog.csdn.net/qq_34…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

css3 transform:scale

transform:scale 语法&#xff1a;transform:scale(x,y); <html> <head><style>.box1 {display: inline-block;width: 200px;height: 200px;background-color: pink;}.box2 {display: inline-block;width: 200px;height: 200px;background-color: red;tran…