`

JVM学习笔记之类装载器-ClassLoader

阅读更多

JVM学习笔记之类装载器-ClassLoader

本文字数:2300,阅读耗时7分钟

JVM体系结构概览

 

类装载器ClassLoader:

负责加载class文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于class文件是否可以允许,则由Execution Engine决定。

本文是由凯哥Java(WXID:kaigejava)分享《JVM系列教程》

 

我们来看看Java类编译成class文件后,文件开头特定的文件标识是什么样的?如下图:

 

类加载器

类加载器的分类:

JVM自带的三个类加载器

启动类加载器:Bootstrap 使用C++语言写的

扩展类加载器:Extension 使用Java语言写的

应用程序类加载器:AppclassLoader。Java也叫系统类加载器,加载当前引用的classPath所有类。

用户自定义加载器:

需要继承Java.lang.ClassLoader的子类。

几种类加载器关系如下图:

 

代码演示:

一:启动类加载器--查看Object的类加载器

执行:

Object obj = new Object();

System.out.println("obj classLoader:"+obj.getClass().getClassLoader());

执行后,我们发现obj的类加载器是null .如下图:

 

分析原因:Object是所有类的父类。是顶级对象。因为是顶级的,所有object的类加载器使用的是bootstrap类加载器。也即调用的是最底层的,所以就是null.

二:查看自定义类的类加载器

自定义一个类:MyObject输出该类的classloader:

sun.misc.Launcher$AppClassLoader.如下图:

 

我们可以看到,自定义类的类加载器来自于AppClassLoader.也即是应用服类加载器。

思考:

为什么我们安装jdk之后,就可以直接使用string类、list类等这些类呢?这些类是什么时候被加载进去的呢?

代开jdk安装目录,找到jre,然后再lib文件夹下找到rt.jar.这个jar就是Java运行时需要的。解压后,我们找到java.lang.string:

 

 

现在知道为什么,安装jdk之后,我们就可以直接使用很多类了吧。因为这些类所在的jar再启动的时候,就被bootstap启动类加载器加载了,所以我们就可以直接使用了!!

怎么证明rt.jar被加载的呢?

我们从自定义的类加载器:sun.misc.Launcher$AppClassLoader。根据包名插在Launcher类所在的位置:

 

我们是在rt.jar中的sun\misc包下找到的。

说明:launcher是一个Java虚拟机的入口应用

三:扩展类加载器

扩展类加载器时什么?怎么用?

根据名字,我们就可以知道,该加载器是为了扩展Java功能的,不被淘汰的。在Java的API中,我们会看到很多,javax.xxx的。这些javax包下的类就是扩展类加载器管理的。

 

对应jre中的ext文件夹下:

 

四:自定义类加载器的层级关系:

下面代码执行后的结果是什么?

private static void showMyObjectClassLoaderLeve() {

MyObject myObject = new MyObject();

System.out.println("MyObject 的爷爷:"+myObject.getClass().getClassLoader().getParent().getParent());

System.out.println("MyObject 的爸爸:"+myObject.getClass().getClassLoader().getParent());

System.out.println("MyObject 自己的:"+myObject.getClass().getClassLoader());

}

 

从运行结果中我们可以看到:

自定义类的类加载器是:AppClassLoader

其父加载器:ExtclassLoader

其父加载器的父加载器:null

从这个层级关系中,我们就可以知道,原来我们自己写的类是在扩展类加载器下。

思考:

如果是object.getclass().getClassLoader().getParent()会输出什么?

答案是:会抛出空指针异常。为什么呢?因为Object是jvm自带的。没有父加载器了。

五:用户自定义的类加载器

需要继承Java.lang.ClassLoader这个类,然后在自定义处理。

如何更好的理解JVM的几种类加载器呢?

我们生活在地球上,其中空气、水、阳光这些是我们必须且赖以生存的基本条件,这三个就相当于是JVM的启动类加载器(BootStap加载器);

为了能安全的生存下去,抵挡自然界或是外界威胁,我们组成了团体,最后组成国家,有了国家的军队保护着就安全了。这就相当于是扩展类加载器(Externsion Class Loader)

要想成为中国人,拥有中国国籍的话,需要至少父母一方是中国人(其他特殊情况不考虑),这个就相当于是应用程序类加载器(AppClassLoader)了;

如果想要生活的更好,自己就要努力,就要有个好工作,有一套属于自己的房子。这个就相当于是用户自定义的类加载器了。

简图如下:

接下来学习:Java的双亲委派机制及沙箱安全机制是什么?如何理解jvm的双亲委派机制?用代码如何验证?欢迎大家和凯哥Java(WXID:kaigejava)一起继续学习

 

0
1
分享到:
评论

相关推荐

    java之jvm学习笔记五(实践写自己的类装载器)

    这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...

    JVM性能学习笔记思维导图

    - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行时被正确地加载到JVM中。 - **运行数据区(Run-Time Data Areas)**:包括程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8后改名为元空间)。 ...

    深入Java虚拟机读书笔记1

    类装载器分为两类:Bootstrap ClassLoader(引导类加载器)和User-defined ClassLoader(用户自定义类加载器)。Bootstrap ClassLoader是JVM的一部分,负责加载JDK核心类库,如rt.jar中的类。而User-defined ...

    java学习笔记整理

    Java的工作流程包括编写源代码,通过编译器生成字节码,然后由JVM的ClassLoader装载类文件,经过校验和解释执行。在安全性方面,Java代码需要通过编译、类装载检查和字节码校验,如果在网络上运行,还有沙箱保护,...

    JAVA_SE毕向东 笔记

    - 加载代码:由类加载器(ClassLoader)完成,负责将类文件加载到JVM中。 - 代码校验:由字节码验证器(Bytecode Verifier)完成,确保字节码的安全性和正确性。 - 执行代码:由运行时解释器(Runtime Interpreter)...

    java私塾基础入门笔记

    3. **类装载**:由ClassLoader负责寻找和装载class文件。 4. **字节码校验**:确保字节码符合规范,不会损害系统安全。 5. **解释执行**:通过解释器将字节码转化为具体平台的机器指令执行。 6. **即时编译**:JIT ...

    Could not find agent

    Java代理是通过JVM的 `-javaagent` 启动参数指定的,它允许在类装载时或之后插入自定义的行为。这通常用于动态字节码操作,例如代码覆盖率报告、性能监控、事务管理等。当JVM无法找到指定的代理时,可能的原因有: ...

Global site tag (gtag.js) - Google Analytics