每天一道面试题-探究JVM中-类的加载机制

面试必考题——JVM加载class文件的原理机制 1、JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后会写个复杂点class ,然后再找一些开源框架,比如Spring ,Hibernate 等等,再然后就开发企业级的应用,比如网站、企业内部应用、实时交易系统等等,直到某一天突然发现做的系统咋就这么慢呢,而且时不时还来个内存溢出什么的,今天是交易系统报了StackOverflowError ,明天是网站系统报了个OutOfMemoryError ,这种错误又很难重现,只有分 阅读详情

类的加载机制是怎么样的?下面我们分几个部分来讲解

1,这些概念你知道是什么意思吗?

相信你应该听过不少这样的词语,

类加载机制,双亲委托机制,BootstrapClassLoader、ExtClassLoader、AppClassLoader

如果你不清楚,这些都是什么意思?没关系,看完下面的内容,你就清楚了

2,什么是类的加载机制?

所谓类的加载机制是指JVM将java类加载到内存的过程。

我们知道,JVM使用Java类的流程如下:

1,首先,Java源文件----编译---->class文件

2,其次,类加载器ClassLoader会读取这个.class文件,并将其转化为java.lang.Class的实例。有了该实例,JVM就可以使用他来创建对象,调用方法等操作了。

那么ClassLoader是以一种什么机制来加载Class的?

具体,分为下面两个方面来考虑

1,这些class文件的来源都有哪些?

2,谁来加载这些class

3,Class文件的来源都有哪些?

1,Java内部自带的核心类,位于$JAVA_HOME/jre/lib

2,Java的扩展类,位于$JAVA_HOME/jre/lib/ext目录下

3,我们自己开发的类或项目开发用到的第三方jar包,位于我们项目的目录下,比如WEB-INF/lib目录

4,谁来加载这些Class?

针对不同的来源,Java分了不同的ClassLoader来加载

1,Java核心类,这些是Java运行的基础类,由一个名为BootstrapClassLoader加载器负责加载。

这个类加载器被称为“根加载器或引导加载器”。

注意:BootstrapClassLoader不继承ClassLoader,是由JVM内部实现。

2,Java扩展类,是由ExtClassLoader负责加载,被称为“扩展类加载器”。

3,项目中编写的类,是由AppClassLoader来负责加载,被称为“系统类加载器”。

那么问题来了,String这个常用类,应该是由哪个类加载器来加载?

你可能会说,这还不简单,String属于核心类,所以由BootstrapClassLoader加载,但这个答案的前提是,我们知道String属于核心类,而作为JVM的加载机制,它是怎么去做到的?所以,我们推出了一个关键点:双亲委托机制

5,双亲委托机制

就是加载一个类,会先获取到一个系统类加载器AppClassLoader的实例,然后往上层层请求,先由BootstarpClassLoader去加载,如果BootStrapClassLoader发现没有,再下发给ExtClassLoader去加载,还是没有,才由AppClassLoader去加载。

总体来说,就是由上层类加载器优先加载,不存在,再由下层类加载器加载,这也是一种安全的考虑。

6,程序验证

案例1:创建一个自己的类,然后打印其类加载器

publicclass ClassLoaderTest {

    publicstaticvoid main(String[] args) throws ClassNotFoundException {

        Class<?> clazz = Class.forName("com.qianfeng.thread.client.Programmer");

        ClassLoader classLoader = clazz.getClassLoader();

        System.out.println(classLoader.getClass().getSimpleName());

    }

}

案例2:打印其双亲类加载器信息

while(classLoader.getParent() != null){

    classLoader = classLoader.getParent();

    System.out.println("-->"+classLoader.getClass().getSimpleName());

}

希望对你有帮助,JVM本身的知识点也非常多,后续会出系列专题

大厂面试突击——JVM篇 文末福利 阅读详情

相关推荐

面试题:每天100w次登录请求, 8G 内存该如何设置JVM参数?

假设一个每天100w次登陆请求的平台,一个服务节点 8G 内存,该如何设置JVM参数?既供大家实操参考又供大家面试参考大家要学习的,除了 JVM 配置方案 之外,是其 分析问题的思路、思考问题的视角。这些思路和视角,能帮助大家走更远、更远。接下来,进入正题。任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数,这个容量与资源规划并不仅仅是系统架构师的随意估算的,需要根据系统所在业务场景去估算,推断出来一个系统运行模型,评估JVM性能和GC频率等等指标。

xuxu96 1097

双亲委派模型的破坏

一、类加载机制 Java虚拟机把描述类的数据从Class文件加载进内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这动作的代码模块成为“类加载器”。 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载他的类加载

基地的博客 2981

GNSS - PPP软件 - GAMP 在VS2019/2022下完成调试、跑通程序(超详细!)

WIN32;_DEBUG;_CONSOLE;O_WARNINGS;ENAGLO;ENACMP;ENAGAL;ENAQZS;NFREQ=3。

qq_43381998的博客 8251

类加载机制。

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。这个阶段是在元数据验证之后,对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害虚拟机的安全事件,主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。

记录学习路上的每一个 “啊哈!” 时刻 欢迎交流,共同进步! 3952

Blender点云渲染实战:用Geometry Nodes快速搞定论文配图(附Cycles渲染技巧)

本文详细介绍了如何利用Blender的Geometry Nodes系统,高效地将三维点云数据转化为高质量的科研论文配图。通过实战步骤,从数据导入、节点化几何处理、材质赋予到Cycles渲染引擎的优化设置,手把手教你制作出专业、美观的可视化图像,助力科研成果展示。

hp777的博客 265

基于STM32的HC-SR04超声波模块测距(新手级)

本人是嵌入式新手,学习了STM32的部分内容,最近想找些项目做,然后顺便学习了一下HC-SR04超声波模块,学习过程中也参考了一些大佬的文章。本文记录了自己的学习方法和学习过程,同时也希望能和各位大佬交流讨论。

weixin_63758495的博客 2206

JVM-类的加载面试题

JVM-类的加载面试题

xiaozhang960825的博客 2556

【Ambari-Metrics监控】Grafana+Infinity快速构建DEMO-实战教学

摘要:本文介绍了如何通过Infinity插件在Grafana中监控Ambari-Metrics(AMS)的CPU核数指标。内容包括配置AMS REST API数据源、创建Dashboard面板、设置JSON解析规则,将时间戳和数值映射为时序数据。最终实现单个节点CPU核数曲线的可视化展示,该方法可扩展至其他AMS指标监控。文章提供了完整的配置示例和API调用验证方法,适用于Grafana 9.x及以上版本对接Ambari集群监控场景。

TTBIGDATA的博客 1352

类的加载机制

类加载的生命周期:加载(Loading)、验证(Verification)、准备(PreParation)、解析(Resolution)、初始化、使用、销毁,其中验证,准备,解析又叫做连接,解析有点特殊,某种特定情况下,解析是在初始化之后执行的。

qq_30941739的博客 1285

风机叶片小规模振动监测数据集--读取测试

ETH风电叶片缺陷数据集–读取测试 数据简介 提示:这里可以添加本文要记录的大概内容: 结构健康监测是保障重要机电设备、建筑设施健康的重要技术手段。 一、lvm_read包安装 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务

cnjs1994的博客 2851

APP签名验证全栈破解:Frida Hook绕过+算法逆向+Python一键调用(附可运行脚本)

做过APP逆向和爬虫的同学,肯定都被签名验证折磨过:改了一行代码重新打包,APP直接闪退;抓包看到接口有个sign参数,翻遍JS找不到加密逻辑;好不容易找到加密函数,一调用就崩溃。客户端APK签名校验服务端接口签名验证。前者防止你篡改APP,后者防止你伪造请求。很多人卡在第一步,改完APK就闪退,根本没机会碰接口。本文基于真实项目实战,分享一套通用的签名验证破解方案。从客户端APK签名校验的Frida Hook绕过,到服务端sign算法的逆向还原,最后用Python实现一键调用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 964

Java类加载机制面试题总结

Java什么时候把类加载到内存?加载阶段做了什么?class文件信息都包括什么?class常量池和运行时常量池区别是什么?这里的class常量池有什么作用吗?类加载器有什么用 什么是链接阶段? 验证阶段有什么用? 验证阶段必须执行吗 准备阶段有什么用 静态变量放在哪 解析阶段有什么用吗 解析阶段什么时候进行 什么是符号应用和直接引用? 初始化阶段有什么用吗 什么时候初始化?.........

wyj123312的博客 2209

游戏服务器框架之跨服(一)

如今的游戏开发,不搞个跨服玩法都不好意思说在做游戏了(当然,也跟游戏类型有关,一些轻度休闲游戏可以排除在外)。跨服玩法的设计,可以进一步激发玩家追求高战力的虚荣心,也可以汇聚玩家数量,避免单服日活跃低呈现死服现象。 几种常见的跨服玩法拓扑结构 一,不同游戏服的玩家进入中立服务器进行战斗,例如跨服天梯类玩法。 游戏服有很多个节点,中心服务器也有很多节点。只要保证对战的双方同时进入同一个中心服游戏进程即可。 二,若干个游戏服组成一个社区,全部服务器包含多个社区,例如世界服玩法。 三,游戏服A玩

littleschemer的博客 5777

每天一个面试题之类加载机制、spirngboot的启动机制

Java虚拟机(JVM)的类加载机制是Java的关键部分,它负责加载、链接和初始化类。类加载机制的主要任务是将Java类的字节码文件转换为可以在JVM上执行的运行时数据结构。这个过程包括以下三个主要步骤:加载(Loading):在此阶段,类加载器负责查找并加载类的字节码文件。这个过程通常从类路径(Classpath)开始,可以包括本地文件系统、网络资源或JAR文件。加载完成后,字节码被存储在内存中,并被用于后续的步骤。

qq_43406318的博客 179

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深入理解JVM之深入Hotspot了解类加载机制

前言 小编最近涉猎比较广泛,有点贪多嚼不烂的感觉,但是每天有学不完的知识(有的是温故而知新),很充实也很满足,重拾技术的热情。今天为大家带来JVM的类加载机制,首先,是否和小编曾经一样,不知道学习JVM有和作用,好像除了面试的时候通通背一遍做几题关于JVM类加载的面试题,之后进入公司后都是写一些业务代码。这是大家深有感触的。那小编为什么要学习JVM,这边罗列了两点;第一:为了搞清楚Java代码运行的本质。第二:真正遇到JVM相关问题时能够解决,并有相应的能力进行调优。 JVM有几大模块组成: 类加载的子系

a1032722788的博客 476

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

每天一道面试题@第三天

最近在翻了一下库存的面经,死去的记忆又开始攻击我,大部分都答不上来....

心有谦谦结 397

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【每天一道面试题】JVM内存分配规则有哪些?

1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。2.需要大量连续内存空间的对象直接进入老年代,这样做的目的是避免在Eden区和两个Survivor区(From space区和To Space区)之间发生大量的内存拷贝。3.长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,...

JavaQ 315

深入解析JVM类加载机制与性能调优

类加载机制是Java虚拟机(JVM)的核心组成部分,负责将.class文件加载到内存并转换为可执行的Java类。其工作原理遵循双亲委派模型,通过启动类加载器、扩展类加载器和应用类加载器的层级结构确保安全性和避免重复加载。在微服务架构和云原生环境中,类加载性能直接影响应用启动速度和内存占用。通过类数据共享(CDS)和预加载技术可以显著优化启动性能,而合理配置Metaspace参数则能避免内存溢出。理解类加载机制不仅对Java面试至关重要,更是解决实际工程中类冲突、热部署等问题的关键。本文结合JVM调优实践,深

weixin_30512965的博客 301

JVM学习(3)——类加载机制&面试题分析

JVM的类加载 我们平时在编译java代码之后,会生成.class文件——字节码文件,JVM会执行字节码文件,JVM执行字节码文件的过程为下面7个阶段 1. 加载 2. 验证 3. 准备 4. 解析 5. 初始化 6. 使用 7. 卸载 加载 简单的说,就是把字节码文件加载到内存中 验证 当JVM加载完Class字节码文件,并在方法区创建对应的Class对象之后,J...

极_晓的博客 3136

c++ ihtmldocument2 html加载_Java类加载到类使用全过程

点击上方蓝字关注我,每天一见,给你力量前言上篇我们说到为了减少Activity类加载的过程,所以可以预创建Activity。有的朋友就问我,类加载,类实例化到底是怎样一个过程,为什么预加载一次就能减少下次加载的时间呢?今天就一起来回顾一下,这也是面试常考的点哦~类的生命周期借用网上的一张图类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七...

weixin_34355348的博客 232

每天一道面试题(三):什么是反射,反射的原理是什么?

什么是反射,反射的作用是什么 ​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键. java类加载机制 要弄清楚java的反射原理,我们首先需要知道java的类加载机制 *.java文件通过编译器编译成为*.class文件 *.class文件通过类加载器加载到 j

不喝阔落的博客 1412

双亲委托类加载机制_一文读懂类加载机制

欢迎关注我的头条号:java架构coid,10年Java软件开发及架构设计经验,专注于Java、致力于每天分享原创文章、快乐编码和开源技术。类记载过程多个java文件经过编译打包生成可运行的jar包,最终由java命令运行某个主类的main函数启动程序,这里首先需要通过类加载器把主类加载到jvm。主类在运行过程中如果使用到其他类,会逐步加载这些类。注意,jar包里的类不是一次性全部加载的,是使用时...

weixin_30767393的博客 209

每天十道面试题-20200403

每天十道面试题-20200403题目解答题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十 题目 1、JVM三大性能调优参数,JVM 几个重要的参数? 2、JVM调优? 3、JVM内存管理,JVM的常见的垃圾收集器,G1垃圾收集器。GC调优,Minor GC ,Full GC 触发条件? 4、java内存模型? 5、Java垃圾回收机制? 6、jvm怎样 判断一个对象是否可回收,怎样的...

YangzaiLeHeHe的博客 455

类加载机制&面试题分析

https://blog.youkuaiyun.com/u011080472/article/details/51332866 类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因。在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器。这一动作是放在Java虚拟机外部去实现的,以...

qq_32534441的博客 319
上一篇: 每天一道面试题-从源码探究HashSet的工作原理
下一篇: 每天一道面试题-运行时异常和非运行时异常-你分清楚了吗?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值