关于类加载器子系统
声明:文章是原创的,图是偷来的,文章段落也有在网上借鉴。如有侵权,联系我。
关于类加载子系统,带着几个问题去写了(抄袭)这篇文章。
- 1.类加载器是什么,是干嘛的?
- 2.类加载器加载的是什么?
- 3.类加载器有几种?
- 4.类加载器的加载顺序?
- …后序学完虚拟机之后,会对文章进行补充完整。有说(抄)的不对的地方,你商标管我。
1.内存结构的概述
1.1虚拟机的整体结构
思考:虚拟机性能高的原因是什么?
- 1.HotSpot JVM是目前市面上高性能虚拟机之一。(只是之一,还有其他的哦)
- 2.它采用的是解释器与即时编译器并存的架构。
- 3.在今天,JVM的性能十分🐮🍺!已经达到了和C/C++能平起平坐的地步。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHkMSf0z-1612197634005)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\05e32da21f7e001e26951a21a6393db5.png)]
1.2虚拟机详细图
- 1.这篇文章主要说的是类加载,就是黄图的部分。😍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QV3gyLoD-1612197634006)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\94f3ef5322aa4dd32f2478f49c98a7af.png)]
假如自己写个虚拟机的话,要考虑哪些结构?
- 类加载器(class loader)
- 执行引擎 (execution engine)
2.1类加载子系统
关于类加载子系统的几个问题
- 1.类加载系统的作用
- 2.jvm中相同的类的定义是什么
2.1.1类加载子系统的作用
-
1.类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。
-
2.ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行殷勤)决定。
-
3.加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)
- ==常量池:==在运行时加载到内存里,就叫做运行时常量池
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mbud8p1o-1612197634007)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\o_200625125306批注 2020-06-25 205256.png)]
2.2关于类加载器ClassLoader角色(★★★★)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VGHy54Re-1612197634009)(N:\OneDrive\java-虚拟机\类加载子系统\java类加载机制.assets\aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doLzEzOTI1MTcxMzgvaW1nUmVwb3NpdG9yeUBtYXN0ZXIvaW1hZ2UtMjAyMDA0MzAxNTMzMzk1NTIucG5n)]
从class文件到对象创建的过程
- 1.编译后到Car class文件放在硬盘上
- 2.物理磁盘中的文件通过二进制流的方式加载到内存
- 3.通过类加载器存放在方法区中(即DNA元数据模版)
- 4.通过getClassLoader()获取是谁加载的这个类(即获得了这个类的类加载器)
- 5.在内存当中调用这个Car 这个class的类构造器就可以在堆中创建几个对象
- 6.针对具体的对象也可调用getClass可以获取类本身(即你是由哪个类所创建的对象)
2.2.1关于ClassLoader提供的六个关键方法(了解)
- 1.loadClass
此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从parentClassLoader中寻找,如仍然没找到,则从System ClassLoader中寻找,最后再调用findClass方法来寻找,如果要改变类的加载顺序,则可覆盖此方法。
- 2.findLoadedClass
此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。
- 3.findClass
此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。
- 4.findSystemClass
此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找,如仍然未找到,则返回null。
- 5.defineClass
此方法负责将二进制的字节码转换为Class对象。
- 6.resolveClass
此方法负责完成Class对象的链接,如已链接过,则会直接返回。
2.3类的加载过程
示例代码
public static void main(String[] args) {
System.out.println("谢谢ClassLoader加载我....");
System.out.println("你的大恩大德,我下辈子再报!");
}
args) {
System.out.println(“谢谢ClassLoader加载我…”);
System.out.println(“你的大恩大德,我下辈子再报!”);
}
> **加载过程**