[java虚拟机]01.类加载器

首先声明:我不会采用复杂的官方语言描述,尽量使用一些白话描述,图片的来源与描述大多数来源于我看过的视频和自己理解,如果有不详细或不正确之处请大家立刻指出我将立刻修改。

虚拟机概览:
[java虚拟机]01.类加载器_第1张图片

类加载器(Class Loader)
1.问题:类加载器是什么?
解答:类加载器用于加载.class文件,将class文件中的字节码内容加载到内存中去,并将这些内容转换成方法区中运行时的数据结构(不明白此处可以暂且放置 等看到方法区的文章自然明白)。

2.问题:描述ClassLoader的使用流程
[java虚拟机]01.类加载器_第2张图片
解答:以Car.class文件,ClassLoader的任务就是将Car.class加载并初始化成Car Class这个类,而至于这个类能否运行就是取决于上述总图中的执行引擎来决定
[java虚拟机]01.类加载器_第3张图片
3.问题:ClassLoader常用的几个?
解答:虚拟机自带的有三个,还加上一个用户自定义的一共四个。
[java虚拟机]01.类加载器_第4张图片
1.启动类加载器 Bootstrap (根加载器,就是一切加载器的爸爸)
我们可以拿java中的Object类为例测试一下它的加载器
[java虚拟机]01.类加载器_第5张图片
我们会发现其打印的是null,为什么?因为这货是c++写的,在java堆
(java堆内容后续讲解,先记住这里)中没有其空间,我们自然会打印出null
2.测试完了java自带的Object类我们可以测试一下自建的类
[java虚拟机]01.类加载器_第6张图片
我们会发现打印的是AppClassLoader,也就是说自建的类是通过AppClassLoader这个应用程序类加载器加载的。
3.还剩下一个就是我们扩展类加载器(Extension Class Loader),它是用来加载一些扩展包的中问的文件,比如javax打头的文件,具体jre中的这个包中的内容其实都是由扩展类加载器加载的
[java虚拟机]01.类加载器_第7张图片
4.问题:什么叫双亲委派机制?沙箱安全机制?
解答:先看下文这张图
[java虚拟机]01.类加载器_第8张图片
我们定义的类或者是java中本身自带的类,它们其实都先从上图的顶点(BootStrap)开始找如果由则返回,没有的话从上到下依次排查 。找不到则返回ClassnotfoundException 。这就是我们所说的双亲委派机制。
这样的好处是什么呢?(体现了沙箱安全机制)
从上文我们可以知道BootStrap中放的一般都是java自带的类,而AppClassLoader存放的是用户自定义的类,这样的话我们即使创建一个与BootStrap中同名的类也不会污染到根部java自带的类。这也就是我们所说的沙箱安全机制!

你可能感兴趣的:(java,jvm)