什么是java的类加载器_JAVA-大白话探索JVM-类加载器(一)
JVM???
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。JVM是Java Virtual Machine(Java虚拟机)的缩写,Java程序编译后,产生.class文件,并不是在CPU上执行,而是由JVM执行,JVM屏蔽了与具体平台相关的信息,针对平台开发其对应的解释器,Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现java平台无关性。从而实现 一次编译,到处运行。
所以,JVM是啥??
不急不急。
先听我讲个故事,从前有座山,山里有座庙···,呃…,错了,再来
从前有名学生,name叫猫猫,手持iphone6,戴着耳机,在课上偷听歌。~囧架架,囧架架。
之后再因缘巧合之下,猫猫荣获7p,那么,问题来了,还能继续使用该耳机吗? 当然是无法使用。
当你使用6的耳机时,却发现怎么也无法使用在iphone7p上(头尾不对),那怎么办??这时转接口就派上用场了。
只需将耳机线完美插入洞里,然后就可以在课上偷偷听歌了。。。呃…
同理,JVM 可以理解为“转接口”,JVM 就是为了方便开发者在编译完java代码后,在不同系统都可运行。做到一次编译,到处运行。
囧架架~~囧囧架
JVM = 类加载器 classloader + 执行引擎 execution engine + 运行时数据区域 runtime data area
现在我们知道JVM是什么了,那来说说看是编译后的.class是怎么加载到内存中的。
类加载器
话不多说,直接上图
我知道看不懂。我也看不懂。哈哈…
不急,先知道是干啥用的。
类加载器
作用:装载.class文件
指将类.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后堆中创建一个java.lang.Class对象,用来封装类在方法区的数据结构。
注:类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它
讲类加载器,一定要知道的机制
双亲委派模型(Parent Delegation Model)
双亲委派模型中除了启动类加载器之外其余都需要有自己的父类加载器,如图中Bootstartp ClassLoader。子类加载器和父类加载器不是以继承的关系来实现,而是通过组合关系来复用父加载器的代码。
过程
当前 ClassLoader 首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。没有的话,就会收到了类加载请求,自己不会首先加载,而是委派给父加载器进行加载,每个层次的加载器都是这样。直到Bootstartp ClassLoader
每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,
等下次加载的时候就可以直接返回了。
好处
双亲委派的好处 : 主要是为了安全性,避免用户自己编写的类动态替换 Java 的一些核心类,由于每个类加载都会经过最顶层的启动类加载器,比如 java.lang.Object这样的类在各个类加载器下都是同一个类(只有当两个类是由同一个类加载器加载的才有意义,这两个类才相等。)
如果没有双亲委派模型,由各个类加载器自行加载的话。当用户自己编写了一个 java.lang.Object类,那样系统中就会出现多个 Object,这样 Java 程序中最基本的行为都无法保证,程序会变的非常混乱。
各类加载器作用
Bootstartp ClassLoader : 加载核心api。
Extension ClassLoader : 加载出了基本 API 之外的一些拓展类。
App ClassLoader : 加载应用程序和程序员自定义的类。
Custom ClassLoader : 供用户自定义加载class
················
················
················
等等,说好的大白话呢
类加载器,顾名思义,加载.class的器,呃····,将就一下
加载过程中,并非顺序加载,而是等需要使用到,就去主动加载。
就像人吃饭,我想吃炸鸡,但是餐厅却一直给我青菜,这很不科学,那怎么办。
我:老板,来一份炸鸡,那就预先主动去点(加载)炸鸡。
然后就是双亲委托模型。
老板:来了,老弟。
客户要炸鸡,那就要命令厨房下厨,厨房发现没鸡(未被加载此类),怎么办?开始委托老板要鸡。
厨房马上找老板,然后老板在仓库找找,也发现没鸡(也未被加载此类),怎么办?开始委托供应商要鸡。
这就得找供应商生产鸡了(加载.class)。
ε=(´ο`*)))唉,吃个炸鸡这么麻烦,不过看老板那么热心。
下次来吃,这次厨房有鸡了(此类已经加载,直接返回),炸鸡也就很快上了。
至于好处。你会发现,我吃的鸡都来自同一供应商(保证自己编写的类属于同一个)。
好了,结束了,下篇再讲讲类加载装载过程。先去吃吃炸鸡咯~~~
欢迎关注
欢迎关注公众号“码上开发”,每天分享最新技术资讯
什么是java的类加载器_JAVA-大白话探索JVM-类加载器(一)相关推荐
- java import自定义类_Java实现的自定义类加载器示例
本文实例讲述了Java实现的自定义类加载器.分享给大家供大家参考,具体如下: 一 点睛 1 ClassLoader类有如下两个关键方法: loadClass(String name, boolean ...
- Java高并发编程详解系列-JVM类加载器
之前的博客中提到了类加载的过程,提到了双亲委托机制,提到了关于类加载器的概念,这篇博客就来给大家分享一下什么是JVM的类加载器.通过实战的方式来了解一下类加载器器到底是什么. JVM类加载器分类 ...
- java中装饰器_Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- java双缓存机制_详解JVM类加载机制及类缓存问题的处理方法
前言 大家应该都知道,当一个Java项目启动的时候,JVM会找到main方法,根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载(其步骤分为加载.验证.准备.解析.初始化 ...
- java内存-xms 单位_java堆内存JVM属性调优总结(-Xms -Xmx -Xmn -Xss)
Xms 是指设定程序启动时占用内存大小.一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢. Xmx 是指设定程序运行期间最大可占用的内存大小.如果程序运行需要占用更多的内存,超出了这 ...
- jvm类加载过程_详解JVM类加载
1. Java对象的创建过程 类加载检查 ===> 分配内存 ===> 初始化零值 ===> 设置对象头 ===> 执行init方法 1.1 类加载检查 虚拟机遇到一条new指 ...
- java class 是否相等_Java重要技术(30)类加载器之Class类型的相等比较
1.1. class类的相等比较 对于class类的对象,只有由相同的类加载器加载,并且类名相同,才是相同的class. 同时,对于类的委托加载机制,可以遵循,也可以不遵循. 定义Hello类. pa ...
- java 8流自定义收集器_Java 8编写自定义收集器简介
java 8流自定义收集器 Java 8引入了收集器的概念. 大多数时候,我们几乎不使用Collectors类中的工厂方法,例如collect(toList()) , toSet()或其他更有趣的方法 ...
- java用户注册代码解析_java springmvc 注册中央调度器代码解析
java springmvc 注册中央调度器代码解析 发布时间:2020-08-22 20:58:23 来源:脚本之家 阅读:107 作者:荆棘人 这篇文章主要介绍了java springmvc 注册 ...
- java 反复器_java集合类中的枚举器(反复器)
在任何集合类中,必须通过某种方法在其中置入对象,再用另一种方法从中取得对象.毕竟,容纳各种各样的对象正是集合的首要任务.在Vector中,addElement()便是我们插入对象采用的方法,而elem ...
最新文章
- 安卓开发 高德地图 marker 点击移动位置_高德手机AR导航再升级,有惊喜
- 刻意练习:LeetCode实战 -- Task27.分发饼干
- 一行Python代码能实现这么多丧心病狂的功能?(代码可复制)
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(单色填充、分组颜色填充)实战(dot plot)
- 用PhpStorm IDE创建GG App Engine PHP应用教程
- c mysql web开发实例教程_java web 开发入门实例
- c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...
- 【STL源码剖析读书笔记】【第6章】算法之partition算法
- 有了vue为什么还学react?
- 【Java从0到架构师】SpringCloud - Hystrix、Zuul
- LAMP_ 访问控制
- SQL 存儲過程加密
- iso硬盘安装 凤凰os_Phoenix OS硬盘版|凤凰系统x86硬盘版下载 v2.5.0正式版 附安装教程 - 121下载站...
- 触动精灵将图片转成base64字符串后通过post方式上传给服务器
- java 32进制10进制互转
- linux雨滴桌面,Rainmeter(雨滴桌面秀)
- Linux修改默认静态IP
- 思科下一代模拟器EVE-NG做一个思科交换机用作DHCP服务器实验
- Apache中文URL中有包含“\x85”字节的汉字时导致的Rewrite失败及404问题
- Kruise Rollout v0.2.0 版本发布:支持 Gateway API、StatefulSet 分批发布等能力