JVM类加载

我们写完的java代码是怎么运行的呢?

".java"文件,编译成".class"文件,然后类加载器把".class"字节码文件中的类给加载到jvm中

接着是jvm来执行我们写好的那些类中的代码.

jvm在什么时候会加载一个类?

在你的代码中需要用到这个类的时候

类的加载过程

加载->验证->准备->解析->初始化->使用->卸载

加载

类加载器

  1. 启动类加载器 Bootstrap ClassLoader JVM启动,首先就会依托启动类加载器,加载java安装目录下lib目录中的核心类库
  2. 扩展类加载器 Extension ClassLoader 加载lib/ext目录中的类
  3. 应用程序类加载器 Application ClassLoader 这类加载器负载加载"ClassPath"环境变量所指定的路径中的类,大致可以理解为去加载写好的代码
  4. 自定义类加载器 除上面几种外,可以自动以类加载器,根据自己的需求加载你的类

双亲委派机制

JVM类加载器是有亲子层级结构的,就是说启动类加载器是最上层,扩展类在第二层,第三层是应用程序类加载器,最后一层是自定义类加载器

假设你的应用程序类加载器需要加载一个类,他首先会委派给自己的父类加载器去加载,最终传导到顶层的类加载器去加载,如果父类加载器在自己负载的范围内,没找到这个类,那么久会下推加载权利给自己的子类加载器

 

验证

这个步骤是根据Java虚拟机规范,来校验你加载进来的".class"文件中的内容是否符合指定的规范

假如你的".class"文件被人篡改了,里面的字节码根本不符合规范,那么JVM是没法去执行这个字节码

准备

给类来分配一定的内存空间,包括类变量的内存空间,并且给一个默认的初始值,如int 类型分配一个"0"这个初始值,布尔类型的默认为false

解析

这个阶段实际上是把符号引用替换为直接引用的过程

初始化

为类的静态变量赋予正确的初始值,如果发现这个类的父类没有初始化,会先暂停,然后去初始化父类,也是走类加载的一套流程,直到父类加载完了,再执行子类的初始化

 

posted @ 2020-10-21 10:47  大碗炸酱面  阅读(72)  评论(0编辑  收藏  举报