目录:
- 前言
- JVM在什么情况下会加载一个类?
- 从实用角度出发,来看看验证、准备和初始化的过程
- 核心阶段:初始化
- 类加载器和双亲委派机制
1、前言
先来看一下JVM整体的一个运行原理。
我们首先从“.java”代码文件,编译成“.class”字节码文件,然后类加载器把“.class”字节码文件中的类给加载到JVM中,接着是JVM来执行我们写好的那些类中的代码,整体是这么个顺序。
我们看看下图,感受一下这个过程:
那么今天,我们就来仔细看看上图中的“类加载”这个过程,看看JVM的类加载机制到底是怎么样的?
搞清楚这个过程了,那么以后在面试时,对面试官常问的JVM类加载机制,就能把一些核心概念说清楚了。
2、JVM在什么情况下会加载一个类?
其实类加载过程非常的琐碎复杂,但是对于我们平时从工作中实用的角度来说,主要是把握他的核心工作原理就可以。
一个类从加载到使用,一般会经历下面的这个过程:
加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
所以首先要搞明白的第一个问题,就是JVM在执行我们写好的代码的过程中,一般在什么情况下会去加载一个类呢?
也就是说,啥时候会从“.class”字节码文件中加载这个类到JVM内存里来。
其实答案非常简单,就是在你的代码中用到这个类的时候
举个简单的例子,比如下面你有一个类(Kafka.class),里面有一个“main()”方法作为主入口。
那么一旦你的JVM进程启动之后,它一定会先把你的这个类(Kafka.cass)加载到内存里,然后从“main()”方法的入口代码开始执行。
我们还是坚持一步一图,大家先看看下图,感受一下:
接着假设上面的代码中,出现了如下的这么一行代码:
这时可能大家就想了,你的代码中明显需要使用“ReplicaManager”这个类去实例化一个对象,此时必须得把“ReplicaManager.class”字节码文件中的这个类加载到内存里来啊!是不是?
所以这个时候就会触发JVM通过类加载器,从“ReplicaManager.class”字节码文件中加载对应的类到内存里来使用,这样代码才能跑起来。
我们来看下面的图: