`

深入JVM:ClassLoader相关知识简介

 
阅读更多

本文什么JVM向大家介绍一下ClassLoader的相关知识,ClassLoader专门负责类文件装入到内存,相信本文介绍一定会让你有所收获。

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

一.什么是ClassLoader?

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

二.ClassLoader的体系结构?

ClassLoader的体系结构


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

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

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

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

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

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

双亲委派的模型可以通过下面的过程体现出来:

(1)"A类加载器"加载类时,先判断该类是否已经加载过了;

(2)如果还未被加载,则首先委托其"A类加载器"的"父类加载器"去加载该类,这是一个向上不断搜索的过程,当A类所有的"祖宗类加载器"(包括了bootstrapclassloader)都没有加载到类,则回到发起者"A类加载器"去加载,如果还加载不了,则抛出ClassNotFoundException.

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

  1. //First,checkiftheclasshasalreadybeenloaded
  2. Classc=findLoadedClass(name);
  3. if(c==null){
  4. try{
  5. if(parent!=null){
  6. c=parent.loadClass(name,false);
  7. }else{
  8. c=findBootstrapClass0(name);
  9. }
  10. }catch(ClassNotFoundExceptione){
  11. //Ifstillnotfound,theninvokefindClassinorder
  12. //tofindtheclass.这里的findClass方法应该被重写,
  13. 默认情况下他是直接抛出ClassNotFoundException
  14. c=findClass(name);
  15. }

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

  1. packagecom.classloader.test;
  2. publicclassClassLoaderTest{
  3. publicstaticvoidmain(String[]args){
  4. ClassLoaderloader=ClassLoaderTest.class.getClassLoader();
  5. while(loader!=null){
  6. System.out.println(loader.getClass().getName());
  7. loaderloader=loader.getParent();
  8. }
  9. System.out.println(loader);
  10. }
  11. }

运行结果如下:

第一行结果表示:ClassLoaderTest的类加载器是AppClassLoader

第二行结果表示:AppClassLoader的类加载器是ExtClassLoder

第三行结果表示:null表示ExtClassLoader的类加载器是BootstrapClassLoader然后,我们可以将这个程序打成jar包ClassLoaderTest.jar放到JRE\lib\ext\目录下,然后重新运行这个程序.得到结果如下:

为什么出现不一样的结果呢?

由于Java类的加载满足双亲委派原则,当我加载ClassLoaderTest类的时候,先看当前类加载器是否已经加载过此类,如果没有,那么由如果上一级的类加载器去加载该类,如果能加载就直接返回.ExtClassLoader会自动加载JRE\lib\ext下面的所有jar包,所以当我们将ClassLoaderTest放到它下面后,程序运行时候利用父加载类ExtClassLoader去加载,就会发现com.classloader.test.ClassLoaderTest已经被加载,所以当前这个程序的运行只用到两个类加载器ExtClassLoader和BootStrap.用java–verbose:classcom.classloader.test.ClassLoaderTest可以更具体的看到运行的时候类加载过程,如下图:

分享到:
评论

相关推荐

    JVM ClassLoader简析

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

    Java SE: ClassLoader in depth

    对于标题“Java SE: ClassLoader in depth”和描述中提到的“源码”、“工具”,实际上在给出的内容部分并没有任何与Java ClassLoader深入相关的技术信息。所提供的内容实际上是一份公司入职报到的指南,与Java编程...

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

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

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

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

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

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

    ClassLoader运行机制 自己写的

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

    JVM基础JVM基础JVM基础

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

    Java的jvm相关知识点

    Java的JVM(Java Virtual Machine)是Java程序运行的基础,它是一个虚拟的...掌握这些JVM相关知识点,不仅能够帮助Java开发者在面试中脱颖而出,也能在实际开发中更好地调试和优化应用程序,提高软件性能和稳定性。

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

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

    深入理解jvm源码

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

    get-jvm:研究JVM并测试其机制

    此外,该项目也可以作为教学和研究的案例,帮助更多的人掌握JVM的相关知识。 总之,"get-jvm"是一个宝贵的资源,它为开发者提供了深入研究JVM的实践环境,通过实际操作和测试,我们可以更全面地理解JVM的工作原理,...

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

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

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

    以下是对JVM与性能优化相关知识点的详细阐述: 1. **JVM内存模型** - **堆内存**:这是JVM中最大的一块内存,用于存储对象实例。堆被分为新生代和老年代,新生代又细分为Eden和两个Survivor空间。 - **栈内存**:...

    learn-jvm:学习jvm

    在深入学习JVM的过程中,我们通常会关注以下几个核心知识点: 1. **内存模型**:JVM内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈。堆内存存储对象实例,栈内存处理方法调用,方法区存储类信息,程序...

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

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

    JVM必知必会

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

    狂神说JVM探究.rar

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

    Java,JVM相关笔记的代码知识

    下面,我们将深入探讨Java与JVM的相关知识点。 1. **类加载机制**:JVM通过类加载器(ClassLoader)将字节码文件(.class)转换成运行时的类。类加载分为加载、验证、准备、解析和初始化五个阶段,每个阶段都有其...

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

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

Global site tag (gtag.js) - Google Analytics