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)一起继续学习
相关推荐
这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...
JVM 给了三种选择:串行收集器、并行收集器、并发收集器。串行收集器只适用于小数据量的情况,而并行收集器和并发收集器适用于大数据量的情况。 并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台...
在Java虚拟机(JVM)中,类装载器(ClassLoader)是至关重要的组成部分,它负责查找和加载Java类到JVM内存中。本教程聚焦于深入理解JVM内核,特别是类装载器的原理、诊断与优化。在这个第六部分中,我们将探讨以下几...
### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...
通过学习本教程,读者将能够了解类加载器的基本功能,并学会如何创建自定义的类加载器来扩展Java虚拟机(JVM)的功能。 #### 二、类加载器结构 类加载器在Java中扮演着极其重要的角色。它不仅负责加载类文件到内存中...
本文将深入探讨JVM中的访问控制器,主要基于“java之jvm学习笔记十一(访问控制器)-源码”这一主题,以及相关的源码分析。 首先,我们得了解Java的安全模型。Java安全模型基于一种称为安全管理器(SecurityManager)...
本篇JVM学习笔记主要关注对象声明、相关内存分配方法以及虚拟内存的物理和虚拟寻址概念。 首先,我们来看对象声明。在Java中,对象是在堆上创建的。例如,`CHeapObj` 类展示了如何在C++中模拟Java对象在堆上的分配...
《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是Java运行时系统的重要组成部分,负责在程序运行期间查找并加载类的二进制数据。理解类装载器的工作原理对于优化Java应用性能和实现动态加载类...
【标题】"nginx-upstream-jvm-route-1.15" 涉及的核心知识点是Nginx的upstream模块与JVM路由的整合,特别针对Nginx 1.15版本。这个项目旨在解决在配置Nginx时遇到的特定错误提示“nginx: [emerg] invalid parameter ...
- **启动类加载器(Bootstrap ClassLoader)**:由C++实现,负责加载JVM核心类库,如rt.jar、resources.jar等。 - **扩展类加载器(Extension ClassLoader)**:负责加载Java扩展目录(`<JAVA_HOME>/jre/lib/ext`...
### JVM学习笔记 #### JVM内存模型 (JMM) JVM内存模型主要分为以下几个部分: - **Java堆**:这是所有线程共享的一块区域,在虚拟机启动时创建。主要用于存放对象实例,几乎所有的对象实例都在这里分配内存。 - *...
Java虚拟机(JVM)是Java程序运行的基础,它提供了执行字节码的平台无关环境。JVM基础知识与调优是每一个Java开发者都需要掌握的...这份"jvm-training"资料包将帮助你系统学习这些关键知识点,成为Java性能优化的专家。
kotlinx-coroutines-io-jvm-0.1.1.jar
本篇JVM学习笔记主要涵盖了以下几个核心知识点: 1. **运行时数据区**: - **程序计数器**:记录当前线程执行的字节码的行号,用于线程恢复执行时跳转到正确位置。 - **Java虚拟机栈**:每个方法执行时创建的栈帧...
逻辑结构主要包括Java源码编译器、JVM执行引擎、类加载器等组件,而物理结构则涵盖了堆、栈、本地方法栈、方法区等内存区域。JDK与JRE的区别在于,JDK包含了开发工具和JRE,而JRE仅包含运行时环境。 Java代码的编译...
类装载器(Class Loader)是Java虚拟机(JVM)的核心组成部分之一,负责将类文件加载到JVM中,以便它们可以被执行。在Java中,每个类都是由类装载器加载到JVM中的,并且每个类都由特定的类装载器实例加载。类装载器...
用户还可以自定义类加载器,继承`java.lang.ClassLoader`,实现自己的类加载策略。类加载器可以在预期需要某个类时预加载,但如果预加载失败,只有在类被首次主动使用时才会抛出错误。 连接阶段的验证是保证类正确...
Java虚拟机(JVM)性能优化是Java开发者面临的重要任务之一,特别是在面试和高级技能提升时,理解JVM的工作机制至关重要。本文将深入探讨JVM类加载过程、JVM加载Class文件的原理以及Java内存分配。 1. **JVM类加载...
这个模型可以用层次结构来表示,例如,系统类装载器(AppClassLoader)的父类是扩展类装载器(ExtClassLoader),扩展类装载器的父类是启动类装载器(Bootstrap ClassLoader)。在示例代码`LoaderSample1`中,我们...
本文将深入探讨JVM中的访问控制器,并通过分析"java之jvm学习笔记十一(访问控制器) -源码"中的`MySecurityManager`来进一步理解其工作原理。 访问控制器的主要任务是对类、方法和字段的访问进行限制,防止恶意代码...