JVM入门之类加载器
JVM架构体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtKNBVLX-1611303275103)(https://note.youdao.com/yws/api/personal/file/F88865AE2E12481A9226A102289EDEF9?method=download&shareKey=8f3e2a79c31985c4a432e9aa401f07a7)]
类加载器
负责加载class文件,class文件在文件开头有特定的文件标示。cafe babe
cafe babe 0000 0034 001e 0a00 0600 1407
0015 0700 160a 0017 0018 0700 1907 001a
0100 063c 696e 6974 3e01 0003 2829 5601
0004 436f 6465 0100 0f4c 696e 654e 756d
将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载。
至于它是否可以运行,则由Execution Engine决定
echo %JAVA_HOME%
echo %PATH%
echo %CLASSPATH%
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0wItdwa-1611303275105)(https://note.youdao.com/yws/api/personal/file/1DA4E458817A4C47B7C23E3427EE8E28?method=download&shareKey=62f17352eaafe07eea2068d094c135c6)]
虚拟机自带的加载器:
-
启动类加载器(Bootstrap)C++。加载jdk自带类,
rt.jar
-
扩展类加载器(Extension)Java.如
javax
-
应用程序类加载器(AppClassLoader)Java也叫系统类加载器,加载当前应用的classpath的所有类.
开发者编写的类加载。
用户自定义加载器:
-
Java.lang.ClassLoader的子类,用户可以定制类的加载方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySzUtPj6-1611303275106)(https://note.youdao.com/yws/api/personal/file/77F6D58273994FE286EF5D5160C23F21?method=download&shareKey=6ee7508ec2a82011036a9ce416901eb0)]
入口文件
rt.jar\sun\misc\Laucher.class
双亲委派
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如
此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没
有找到所需加载的Class),子类加载器才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的
启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。
参考
2020权威_juc 与 jvm 并发编程 Java 必学_阳哥- 尚硅谷:https://www.bilibili.com/video/BV1vE411D7KE?p=78