【面试题精讲】JVM-类加载器

简介: 【面试题精讲】JVM-类加载器

1. 什么是类加载器?

类加载器(Class Loader)是 Java 虚拟机(JVM)的一部分,主要负责将 class 文件从硬盘等外部存储加载到内存中,并在 JVM 运行时期进行动态链接。

Java 的类加载器架构是通过类加载器之间的级联关系来统一组织和管理类及其加载的。其被设计成扩展机制,支持多种不同类型的类型文件(JAR、ZIP、WebInf 等),并且通过“父-子”委派模型来保证安全性。

2. 为什么需要类加载器?

Java 语言的可移植性是 Java 获得成功的最重要原因之一。而类加载器正是 Java 可移植性的核心所在,使 Java 程序能够在不同的操作系统和硬件环境中运行。同时,它还具有以下几个重要功能:

  • 隔离命名空间:类加载器隔离了不同的类命名空间,保证了在同一个命名空间内对同一个全限定名的类只被加载一次,也解决了不同类文件中有同名类而导致的问题。
  • 动态链接:动态链接是类加载器最主要的功能。JVM 在运行期间才会确定类的具体信息,而不是在编译期间,这就保证了程序的灵活性。
  • 保护重要类:Java 的启动类是由 JVM 预先定义的,比如 Object、String 等,这些核心 Java 类由引导类加载器(Bootstrap ClassLoader)来加载,它是 JVM 的一部分(用本地代码实现),因此应用程序无法直接使用它,从而保证了 Java 运行的稳定性和安全性。

3. 类加载器的实现原理

Java 虚拟机规范(JVM Specification)中定义了三种类加载器:引导类加载器(Bootstrap ClassLoader)扩展类加载器(Extension ClassLoader)应用程序类加载器(Application ClassLoader)。不同类加载器的主要区别在于寻找类文件的方式以及类加载器间的父子关系。其中,引导类加载器负责加载 JVM 必须的核心类(如 java.lang、java.io 等),属于最顶层的类加载器,而另外两个类加载器则是 Java 程序员在开发中最常用到的两种类加载器。

Java 虚拟机在执行一个类时,先由当前正在执行的线程的类加载器去找该类,如果找到并成功加载,则立即结束查找;如果找不到该类,则委托给它的父类加载器去查找,直到找到为止,或到达最顶层的类加载器后仍然找不到该类,则抛出 ClassNotFoundException。

4. 类加载器的使用示例

// 获取类加载器
ClassLoader classLoader = MyClassLoader.class.getClassLoader();
// 打印 classLoader 的层级关系
while (classLoader != null) {
    System.out.println(classLoader);
    classLoader = classLoader.getParent();
}

5. 类加载器的优点

  • 提高程序的灵活性和可拓展性:Java 类加载器为 Java 程序提供了想要随时替换、更新和升级代码的好处,增强了其灵活性和可拓展性。
  • 隔离不同的 jar 包:由于 Java 可由多个 jar 包组成,所以 Java 类加载器将每个 jar 包作为单独的命名空间来加载,从而可以隔离不同的 jar 包和它们之间的类,防止类的调用冲突。

6. 类加载器的缺点

  • 协同工作带来的负担:由于类加载器是相互协同的,如果其中一个类加载器出现了问题,将可能导致整个系统的崩溃。
  • 内存占用:不同的类加载器会共同创建多个相同类或接口的 Class 对象,并各自维护其自身的 Class 对象的引用。这些重复的 Class 对象实际上占用了大量的内存。

7. 类加载器的使用注意事项

  • 类变动重载不成功:类加载器缓存了已经加载过的类,当检测到类变动时,不会全部重载,此时需要完全重新加载系统中涉及到的所有类。
  • ClassLoader 对象的泄漏:ClassLoader 对象重要,存在泄漏应该结合代码进行分析优化.
  • 线程上下文类加载器的使用:线程上下文类加载器,在多线程并发时容易发生混乱,可能会引发类路径设置错误或者是某些依赖包的 Jar 无法加载的问题。

8. 总结

类加载器在 JVM 中扮演着非常关键的角色。它通过委派模型来保证不同类加载器在虚拟机中的并存,实现如代码隔离、安全性检查等诸多保障。同时,类加载器也有自己的缺点,比如协同工作的负担、内存占用等。因此,在使用时需要注意遵守一些注意事项,并区分优缺点,从而合理的使用类加载器。

本文由 mdnice 多平台发布


相关文章
|
2月前
|
安全 前端开发 Java
【JVM的秘密揭秘】深入理解类加载器与双亲委派机制的奥秘!
【8月更文挑战第25天】在Java技术栈中,深入理解JVM类加载机制及其双亲委派模型是至关重要的。JVM类加载器作为运行时系统的关键组件,负责将字节码文件加载至内存并转换为可执行的数据结构。其采用层级结构,包括引导、扩展、应用及用户自定义类加载器,通过双亲委派机制协同工作,确保Java核心库的安全性与稳定性。本文通过解析类加载器的分类、双亲委派机制原理及示例代码,帮助读者全面掌握这一核心概念,为开发更安全高效的Java应用程序奠定基础。
85 0
|
6天前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
1月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
8天前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
19 3
|
1月前
|
存储 缓存 监控
【Java面试题汇总】JVM篇(2023版)
JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优
【Java面试题汇总】JVM篇(2023版)
|
6天前
|
存储 Kubernetes 架构师
阿里面试:JVM 锁内存 是怎么变化的? JVM 锁的膨胀过程 ?
尼恩,一位经验丰富的40岁老架构师,通过其读者交流群分享了一系列关于JVM锁的深度解析,包括偏向锁、轻量级锁、自旋锁和重量级锁的概念、内存结构变化及锁膨胀流程。这些内容不仅帮助群内的小伙伴们顺利通过了多家一线互联网企业的面试,还整理成了《尼恩Java面试宝典》等技术资料,助力更多开发者提升技术水平,实现职业逆袭。尼恩强调,掌握这些核心知识点不仅能提高面试成功率,还能在实际工作中更好地应对高并发场景下的性能优化问题。
|
1月前
|
Arthas Java 测试技术
JVM —— 类加载器的分类,双亲委派机制
类加载器的分类,双亲委派机制:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器;JDK8及之前的版本,JDK9之后的版本;什么是双亲委派模型,双亲委派模型的作用,如何打破双亲委派机制
JVM —— 类加载器的分类,双亲委派机制
|
17天前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
3月前
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
2月前
|
缓存 算法 Java
这些年背过的面试题——JVM篇
本文是技术人面试系列JVM篇,面试中关于JVM都需要了解哪些基础?一文带你详细了解,欢迎收藏!