什么是java的类加载器_JAVA-大白话探索JVM-类加载器(一)

JVM???

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

timg?image&quality=80&size=b9999_10000&sec=1547726204&di=02951b9d307b7b9dea65bd82bbe38e2e&imgtype=jpg&er=1&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F1c8c4055e2965afb448a6aabb9374948624a1a765062-BE47vR_fw658

所以,JVM是啥??

不急不急。

先听我讲个故事,从前有座山,山里有座庙···,呃…,错了,再来

从前有名学生,name叫猫猫,手持iphone6,戴着耳机,在课上偷听歌。~囧架架,囧架架。

之后再因缘巧合之下,猫猫荣获7p,那么,问题来了,还能继续使用该耳机吗? 当然是无法使用。

当你使用6的耳机时,却发现怎么也无法使用在iphone7p上(头尾不对),那怎么办??这时转接口就派上用场了。

3548c1cc682c8d8ece827762488e66fd.png

只需将耳机线完美插入洞里,然后就可以在课上偷偷听歌了。。。呃…

同理,JVM 可以理解为“转接口”,JVM 就是为了方便开发者在编译完java代码后,在不同系统都可运行。做到一次编译,到处运行。

囧架架~~囧囧架

JVM = 类加载器 classloader + 执行引擎 execution engine + 运行时数据区域 runtime data area

现在我们知道JVM是什么了,那来说说看是编译后的.class是怎么加载到内存中的。

9150e4e5ly1fmxtub5ddnj205f05c747.jpg

类加载器

话不多说,直接上图

969b7323014f33e2ad73d18d7e873e26.png

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

9150e4e5gy1ftz2qyg4qcj205i05fjre.jpg

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

类加载器

作用:装载.class文件

指将类.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后堆中创建一个java.lang.Class对象,用来封装类在方法区的数据结构。

注:类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它

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

timg?image&quality=80&size=b9999_10000&sec=1547480449165&di=41a54750150c78c5bc17cefd4aecc8b2&imgtype=0&src=http%3A%2F%2Fimg.gifhome.com%2Fgif%2Femoji%2F2018%2F055ed14adfc14d1eb24cfa0b2860bb55.jpg

双亲委派模型(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

timg?image&quality=80&size=b9999_10000&sec=1547481936143&di=7f5991dab042c9036125b18b5ebb5886&imgtype=0&src=http%3A%2F%2Fimages.bqshuo.com%2F81ce2a808e7e4fe5b385d7c06a06f295.jpg

················

················

················

等等,说好的大白话呢

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

31575f07fecb042b7c7cf2b11c9ba3e6.png

加载过程中,并非顺序加载,而是等需要使用到,就去主动加载。

就像人吃饭,我想吃炸鸡,但是餐厅却一直给我青菜,这很不科学,那怎么办。

我:老板,来一份炸鸡,那就预先主动去点(加载)炸鸡。

然后就是双亲委托模型。

老板:来了,老弟。

客户要炸鸡,那就要命令厨房下厨,厨房发现没鸡(未被加载此类),怎么办?开始委托老板要鸡。

厨房马上找老板,然后老板在仓库找找,也发现没鸡(也未被加载此类),怎么办?开始委托供应商要鸡。

这就得找供应商生产鸡了(加载.class)。

ε=(´ο`*)))唉,吃个炸鸡这么麻烦,不过看老板那么热心。

下次来吃,这次厨房有鸡了(此类已经加载,直接返回),炸鸡也就很快上了。

至于好处。你会发现,我吃的鸡都来自同一供应商(保证自己编写的类属于同一个)。

好了,结束了,下篇再讲讲类加载装载过程。先去吃吃炸鸡咯~~~

欢迎关注

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络(CNN)是一种常用于图像处理和模式识别的深度学习模型。它的设计灵感来自于生物学中视觉皮层的神经元结构。为了用通俗的语言解释CNN,我们可以用以下方式来理解它: 假设你要识别一张猫的图片。首先,你的大脑会将这张图片的像素点转化成一系列数字,并且记录下它们的位置和颜色。然后,大脑会将这些数字输入到“卷积层”中。 在卷积层中,会有很多个“过滤器”。这些过滤器可以视为一双眼睛,它们通过抓取图片的不同特征来帮助你识别物体。每个过滤器都在图片上滑动并计算一个“特征图”,这个特征图描述了所检测到的特定特征。例如,一个过滤器可以检测到猫的边缘,另一个可以检测到猫的颜色等等。当所有过滤器完成计算后,就会得到一些不同的特征图。 在“池化层”中,每个特征图都会被压缩,去除一些不重要的信息。这样可以减少需要计算的数据量,并且使得特征更加鲁棒和不变形。 最后,在全连接层中,所有的特征图都被连接起来,形成一个巨大的向量。接下来,这个向量会通过一些神经元节点,最终输出识别结果,也就是“这是一张猫的图片”。 CNN的一个重要特点是参数共享,这意味着每个过滤器会在整个图片上进行计算,而不仅仅是某个局部区域。这样可以减少需要计算的参数量,提高训练速度和模型的泛化能力。 总结一下,CNN通过卷积层来提取图像的特征,并通过池化层降低特征的维度。最后,通过全连接层将所有特征连接起来并输出结果。这种结构使得CNN非常适合于图像分类和识别任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值