JAVA-大白话探索JVM-类加载器(一)

作者: b6cd76971b2d | 来源:发表于2019-03-08 09:24 被阅读1次

JVM

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。JVM是Java Virtual Machine(Java虚拟机)的缩写,Java程序编译后,产生.class文件,并不是在CPU上执行,而是由JVM执行,JVM屏蔽了与具体平台相关的信息,针对平台开发其对应的解释器,Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现java平台无关性。从而实现 一次编译,到处运行

image

所以,JVM是啥??

不急不急。
先听我讲个故事,从前有座山,山里有座庙···,呃...,错了,再来
从前有名学生,name叫猫猫,手持iphone6,戴着耳机,在课上偷听歌。~囧架架,囧架架。
之后再因缘巧合之下,猫猫荣获7p,那么,问题来了,还能继续使用该耳机吗? 当然是无法使用。
当你使用6的耳机时,却发现怎么也无法使用在iphone7p上(头尾不对),那怎么办??这时转接口就派上用场了。


image

只需将耳机线完美插入洞里,然后就可以在课上偷偷听歌了。。。呃…
同理,JVM 可以理解为“转接口”,JVM 就是为了方便开发者在编译完java代码后,在不同系统都可运行。做到一次编译,到处运行。
囧架架~~囧囧架

JVM = 类加载器 classloader + 执行引擎 execution engine + 运行时数据区域 runtime data area
现在我们知道JVM是什么了,那来说说看是编译后的.class是怎么加载到内存中的。

image

类加载器

话不多说,直接上图

image

我知道看不懂。我也看不懂。哈哈…


image

不急,先知道是干啥用的。

作用:装载.class文件
指将类.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后堆中创建一个java.lang.Class对象,用来封装类在方法区的数据结构。
注:类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它

讲类加载器,一定要知道的机制

image

双亲委派模型(Parent Delegation Model)

双亲委派模型中除了启动类加载器之外其余都需要有自己的父类加载器,如图中Bootstartp ClassLoader。子类加载器和父类加载器不是以继承的关系来实现,而是通过组合关系来复用父加载器的代码。

过程

  1. 当前 ClassLoader 首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。没有的话,就会收到了类加载请求,自己不会首先加载,而是委派给父加载器进行加载,每个层次的加载器都是这样。直到Bootstartp ClassLoader
每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,
等下次加载的时候就可以直接返回了。

好处

双亲委派的好处 : 主要是为了安全性,避免用户自己编写的类动态替换 Java 的一些核心类,由于每个类加载都会经过最顶层的启动类加载器,比如 java.lang.Object这样的类在各个类加载器下都是同一个类(只有当两个类是由同一个类加载器加载的才有意义,这两个类才相等。)
如果没有双亲委派模型,由各个类加载器自行加载的话。当用户自己编写了一个 java.lang.Object类,那样系统中就会出现多个 Object,这样 Java 程序中最基本的行为都无法保证,程序会变的非常混乱。

各类加载器作用

  • Bootstartp ClassLoader : 加载核心api。
  • Extension ClassLoader : 加载出了基本 API 之外的一些拓展类。
  • App ClassLoader : 加载应用程序和程序员自定义的类。
  • Custom ClassLoader : 供用户自定义加载class
    image
    ················
    ················
    ················

等等,说好的大白话呢

类加载器,顾名思义,加载.class的器,呃····,将就一下

image
加载过程中,并非顺序加载,而是等需要使用到,就去主动加载。
就像人吃饭,我想吃炸鸡,但是餐厅却一直给我青菜,这很不科学,那怎么办。
我:老板,来一份炸鸡,那就预先主动去点(加载)炸鸡。
然后就是双亲委托模型。
老板:来了,老弟。
客户要炸鸡,那就要命令厨房下厨,厨房发现没鸡(未被加载此类),怎么办?开始委托老板要鸡。
厨房马上找老板,然后老板在仓库找找,也发现没鸡(也未被加载此类),怎么办?开始委托供应商要鸡。
这就得找供应商生产鸡了(加载.class)。
ε=(´ο`*)))唉,吃个炸鸡这么麻烦,不过看老板那么热心。
下次来吃,这次厨房有鸡了(此类已经加载,直接返回),炸鸡也就很快上了。
至于好处。你会发现,我吃的鸡都来自同一供应商(保证自己编写的类属于同一个)。
好了,结束了,下篇再讲讲类加载装载过程。先去吃吃炸鸡咯~~~

个人博客文章链接

https://www.ccode.live/bertonlee/list/6

欢迎关注

欢迎关注公众号“码上开发”,每天分享最新技术资讯

image

相关文章

  • JAVA-大白话探索JVM-类加载过程(二)

    首先我们知道JVM是什么以及类加载器的作用 不清楚的可以看看JAVA-大白话探索JVM-类加载器(一) 现在我们来...

  • JAVA-大白话探索JVM-类加载器(一)

    JVM Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。JVM是Ja...

  • JVM-类加载器

    JVM-类加载器 类与类加载器 对于类与类加载器有两种限定: 对于任意一个类,都需要由加载它的类加载器和这个类本身...

  • JVM类加载器与双亲委派模型(JDK8)

    引言 在上文JVM-类加载机制[https://imchenway.com/2021/07/01/JVM-%E7%...

  • JVM-类加载器

    类加载器 类加载器是用来把类加载到JAVA虚拟机中。 类加载的过程 类的加载过程采用了父亲委托的机制,这种机制能更...

  • Java-类加载器

    每个java程序至少有3个类加载器: 引导类加载器: 负责加载系统类,通常从rt.jar文件中进行加载。通常由C语...

  • java-类加载器

    http://ifeve.com/classloader/深入浅出classloader https://www....

  • 初识JVM-类加载器1

    1.前言 每当我们编写一个Java程序的时候都会经历,编写,编译,运行的一个过程。编译的过程是通过Java的编译器...

  • 初识JVM-类加载器2

    1前言 在上一小节内容中我们介绍了类加载过程的相关概念,在这一小节我们就接着上一小节的内容介绍一下类加载器的一些内...

  • java基础知识之java类加载器

    1. 什么是类加载器 类加载器就是用来加载类的东西!类加载器也是一个类:ClassLoader 类加载器可以被加载...

网友评论

    本文标题:JAVA-大白话探索JVM-类加载器(一)

    本文链接:https://www.haomeiwen.com/subject/xaelpqtx.html