Java面试必问:类加载过程与类加载器

简介: Java面试必问:类加载过程与类加载器

一、类加载过程



先说一下类的生命周期吧


加载、验证、准备、解析、初始化、使用、卸载


类的加载过程也发生在类的生命周期中,其实就是他的前五步:


1、加载

查找加载类的二进制数据(Class文件)

其中,在方法区中存放类的信息;在堆中存放Class文件对应的类实例


2、验证

确保加载的类信息是正确的


3、准备

为类的静态变量进行初始化,分配空间并赋予初始值


4、解析

是将符号引用转换为直接引用


5、初始化

JVM对类进行初始化,对静态变量赋予正确的值


面试中说清楚每一步是干嘛的基本上就行了。


二、类加载器



我们首先随便创建一个类,看一下当前类的类加载器是什么

@Test
    public void test(){
        ClassLoader classLoader = this.getClass().getClassLoader();
        System.out.println(classLoader);
    }

5f53d1be0bdd46a2807768ec6ae5077d.png


再看看他的上级

@Test
    public void test(){
        ClassLoader classLoader = this.getClass().getClassLoader();
        System.out.println(classLoader);
        System.out.println(classLoader.getParent());
    }


9190a2e1aec34efa87637d6ff7af729c.png


再往上看:

System.out.println(classLoader.getParent().getParent());


4b63fc072609466b9ab4898145276630.png


显示为null,是没有了吗?并不是的。其实最高的加载器叫做BootStrapClassLoader,是用C语言写的,所以打印不出来。


那么我们就可以总结一下这些加载器了,由上到下:


1、 BootStrapClassLoader        加载的其实是所有类路径为 java.* 的类


2、ExtClassLoader                    加载的其实是所有类路径为 javax.* 的类


3、AppClassLoader                   加载用户自定义的类


4、用户自定义类加载器


参考:Java面试必知必会.Java虚拟机.02.类加载机制_哔哩哔哩_bilibili


相关文章
|
4天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
6天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
33 17
|
1天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
19 4
|
2天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
9 2
|
6天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
10天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
18 3
|
存储 Java
java的各种加载和初始化的详细过程
一、什么时候加载和初始化 1、类什么时候加载 类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式[eagerly load](只要有其它类引用了它就加载)加载类,也可以是懒加载[lazy load](等到类初始化发生的时候才加载)。
1967 0
|
11天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
88 38
|
8天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
3天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####