`

深入JVM(4):关于ClassLoader的一些知识

阅读更多

一.什么是ClassLoader?

Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类.此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存。ClassLoader专门负责类文件装入到内存.

二.ClassLoader的体系结构?

class_load_arch

 

从上图我们就可以看出类加载器之间的父子关系(注意不是类的集继承关系)和管辖范围。

(1)BootStrap 是最顶层的类加载器,它是由C++编写而成,并且已经内嵌到JVM中了,主要用来读取Java的核心类库JRE/lib/rt.jar

(2)Extension ClassLoader是是用来读取Java的扩展类库,读取JRE/lib/ext/*.jar

(3)App ClassLoader是用来读取CLASSPATH指定的所有jar包或目录的类文件

(4)Custom ClassLoader是用户自定义编写的,它用来读取指定类文件

三.什么是双亲委派模型?

双亲委派的模型可以通过下面的过程体现出来:
(1)"A类加载器"加载类时,先判断该类是否已经加载过了,
(2)如果还未被加载,则首先委托其"A类加载器"的"父类加载器"去加载该类,这是一个向上不断搜索的过程,当A类所有的"祖宗类加载器"(包括了bootstrap classloader)都没有加载到类,则回到发起者"A类加载器"去加载,如果还加载不了,则抛出ClassNotFoundException.

更详细的信息你可以去参看java.lang.ClassLoader的loadClass(String name,boolean resolve)方法,代码摘要如下:

// First, check if the class has already been loaded
    Class c = findLoadedClass(name);
    if (c == null) {
        try {
        if (parent != null) {
            c = parent.loadClass(name, false);
        } else {
            c = findBootstrapClass0(name);
        }
        } catch (ClassNotFoundException e) {
            // If still not found, then invoke findClass in order
            // to find the class.这里的findClass方法应该被重写,默认情况下他是直接抛出ClassNotFoundException
            c = findClass(name);
        }
 

那我们如何去验证这个模型呢?我们看下面这段程序,找出ClassLoaderTest的类加载器和他的所有祖宗加载器。

package com.classloader.test;

public class ClassLoaderTest {
    public static void main(String[] args) {
        ClassLoader loader = ClassLoaderTest.class.getClassLoader();
           
        while (loader != null) {
            System.out.println(loader.getClass().getName());
            loader = loader.getParent();
        }
        System.out.println(loader);

    }
}
运行结果如下:
class_loader_test_1 
第一行结果表示:ClassLoaderTest的类加载器是AppClassLoader
第二行结果表示:AppClassLoader的类加载器是ExtClassLoder
第三行结果表示:null表示ExtClassLoader的类加载器是Bootstrap ClassLoader
 
然后,我们可以将这个程序打成jar包ClassLoaderTest.jar放到JRE\lib\ext\目录下,然后重新运行这个程序.
得到结果如下:
class_loader_test_2 
 
为什么出现不一样的结果呢?
由于Java类的加载满足双亲委派原则,当我加载ClassLoaderTest类的时候,先看当前类加载器是否已经加载过此类,如果没有,那么由
如果上一级的类加载器去加载该类,如果能加载就直接返回.
ExtClassLoader会自动加载JRE\lib\ext下面的所有jar包,所以当我们将ClassLoaderTest放到它下面后,程序运行时候利用
父加载类ExtClassLoader去加载,就会发现com.classloader.test.ClassLoaderTest已经被加载,所以当前这个程序的运行
只用到两个类加载器ExtClassLoader和BootStrap.
 
java –verbose:class com.classloader.test.ClassLoaderTest可以更具体的看到运行的时候类加载过程,如下图:
image 
 
PS:
本文中所用到得ClassLoaderTest.jar下载.
 

分享到:
评论

相关推荐

    JVM ClassLoader简析

    本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种基本类型:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。Bootstrap ClassLoader是JVM...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    【JVM运行机制详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行...在《深入JVM内核—原理、诊断与优化》视频教程中,会详细讲解这些内容,并结合实际案例进行演示和实践,帮助开发者成为JVM领域的专家。

    JVM详解:带书签超清文字版.pdf

    ### JVM详解核心知识点 #### 一、Java与JVM概览 **1.1 Java定义** Java是一种广泛使用的面向对象的编程语言,以其强大的跨平台兼容性和安全性著称。Java程序能够运行在任何安装了Java运行环境(JRE)的设备上,这...

    探索JVM底层奥秘ClassLoader源码分析与案例讲解

    深入理解ClassLoader的工作原理,对于优化JVM性能,解决类冲突问题,以及设计复杂的插件系统等都有极大的帮助。通过阅读和分析ClassLoader的源码,我们可以更好地理解JVM如何管理类的生命周期,并能够针对具体需求...

    Java SE: ClassLoader in depth

    然而,我可以根据标题和描述中要求的知识点,给出关于Java ClassLoader的一些深入知识点。 Java ClassLoader是Java运行时环境中用于动态加载Java类到JVM(Java虚拟机)的一个组件。深入理解ClassLoader是深入理解...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    总的来说,JVM原理、JVM调优、JVM内存模型和JAVA并发是Java程序员和系统管理员需要深入了解的知识点,因为它们直接影响到Java程序的性能和稳定性。了解这些知识点有助于开发者编写性能更优的代码,并在生产环境中对...

    ClassLoader运行机制 自己写的

    理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行机制,特别是自定义ClassLoader的设计与实现。 ClassLoader的基本职责是根据类名动态加载对应的类文件。在...

    Java的jvm相关知识点

    - 理解Java:JVM是Java的核心组成部分,深入理解JVM有助于理解Java的工作原理。 - 解决线上问题:通过JVM的知识,可以进行热替换升级软件,预防和处理内存泄漏,优化内存使用,以及提高系统吞吐量。 2. JVM产品:...

    深入JVM内核 - 原理、诊断与优化

    介绍JVM的基本知识和发展历史,并介绍了Java语言规范和JVM规范。 第二课 JVM运行机制简介 堆、栈、方法区等 JVM启动流程 内存模型和volatile实例 解释和编译运行的概念 介绍JVM的内部结构、启动流程以及内存模型。...

    JVM思维导图(包含所有JVM知识)

    本文将深入探讨JVM的主要知识点,包括内存模型、类加载机制、垃圾收集器及其算法、内存调优工具,以及相关配置选项。 1. **JVM内存模型** - **对象创建与内存分配**:JVM根据对象大小和生命周期将其分配到堆内存的...

    了解Java ClassLoader

    理解ClassLoader的工作原理对于深入学习Java以及进行JVM优化、插件开发等高级技术至关重要。下面将详细介绍Java ClassLoader的基本概念、工作流程、类加载机制以及自定义ClassLoader。 1. **ClassLoader基本概念** ...

    JVM基础JVM基础JVM基础

    ### JVM基础知识详解 #### HotSpot简介 HotSpot作为Oracle(原属SUN)的主要Java虚拟机实现,自2006年起开源,并成为OpenJDK项目的核心组成部分。它主要使用C++编写,支持多种操作系统和硬件架构。HotSpot的一个...

    深入理解jvm源码

    《深入理解Java虚拟机》是Java开发者深入了解JVM(Java Virtual Machine)的必备书籍,尤其对于想要提升技术深度、优化程序性能的工程师来说,更是不可或缺的参考资料。这本书的第二版全面覆盖了JVM的最新发展,包括...

    JVM必知必会

    ### JVM必知必会知识点梳理 #### 1. JVM的定义与层次 Java虚拟机(JVM)具有多重含义: - **一套规范**:即Java虚拟机规范,定义了Java虚拟机应该具有的行为。 - **一种实现**:例如HotSpot、J9、JRockit,它们都是...

    狂神说JVM探究.rar

    【狂神说JVM探究】是一份集合了...这些知识点覆盖了JVM的基础到进阶内容,适合初学者和有一定经验的开发者深入理解Java运行机制。通过学习这份资料,读者可以系统地掌握JVM的工作原理,并提升Java应用的性能优化能力。

    java classloader

    Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...

    深入JVM内核—原理、诊断与优化视频教程-6. 类装载器

    在Java虚拟机(JVM)中,类装载器(ClassLoader)是至关重要的组成部分,它负责查找和加载Java类到JVM内存中。本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几...

    JVM与性能优化知识点整理.zip

    以上知识点构成了JVM性能优化的基础,通过深入理解和实践,可以有效地提高Java应用程序的运行效率和稳定性。在实际优化过程中,需要结合具体的应用场景和业务需求进行调整,确保优化措施能够带来实际的性能提升。

    JVM面试题资源

    以下是一些关于JVM的常见面试题和相关知识点: 1. **JVM的组成** - **类装载器(ClassLoader)**:负责加载类文件到JVM内存中,分为 Bootstrap ClassLoader、Extension ClassLoader 和 AppClass ClassLoader。 - **...

Global site tag (gtag.js) - Google Analytics