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)一起继续学习
JVM学习笔记之类装载器-ClassLoader的更多相关文章
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- JVM学习笔记:虚拟机的类加载机制
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...
- JVM学习笔记——类加载过程
JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
- JVM学习笔记——内存结构篇
JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...
随机推荐
- 用hive或mr清洗app数据
1.项目背景 从大量源数据中清洗出有效数据供后续程序使用. 源数据参照log.txt文件 2.项目源数据说明 9841EF7BDBDF0AC9AF42AEBB4E4F8D4F Id 12 状态1 22 ...
- Linux基本编程环境安装
前言 可以采用组合式安装,如:https://oneinstack.com/ 选择好要安装的,然后复制安装命令就可以一键搞定很多东西了 VMware安装Centos7 按照物理机CPU实际情况,选择处 ...
- 转-tomcat在控制台打印时乱码
描述 使用windows的控制台启动tomcat (8.5),Tomcat终端打印出现乱码,在CSDN上找到一个简单有效的解决办法,在此记录. 解决方案 找到Tomcat的根目录下的 /conf/lo ...
- 张高兴的 MicroPython 入门指南:(二)GPIO 的使用
目录 什么是 GPIO 使用方法 使用微动开关点亮板载 LED 硬件需求 电路 代码 参考 什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即&quo ...
- Spring面试题及答案
Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心: ①. IOC/DI(控制反转/依赖注入) :把dao依赖注入到s ...
- AT_abc182_d 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 从数轴的原点开始向正方向走. 第一次向前走 \(a_1\) 步,第二次向前走 \(a_ ...
- 搭建lnmp环境-php(第二步)
系统环境:centos7 php7.4 编译安装太繁琐,这里用yum安装即可 ===========yum形式安装======== # 安装EPEL源(nginx那里已安装了,跳过) yum inst ...
- python的Faker使用
import json from faker import Faker from faker_demo.CustomFaker import CustomProvider myfaker = Fake ...
- Jmeter二次开发函数 - 文本替换
此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...
- cpu亲和性相关函数和宏 基础讲解[cpu_set_t]
cpu亲和性相关函数和宏讲解: 写在前面: 我在查找关于linux cpu宏函数没看到有对宏函数基础的.详细的讲解,笔者便通过官方文档入手,对次进行的翻译和理解希望能帮到对这方面宏有疑惑的读者 exp ...