加载|我们的java程序如何跑起来

1、我们的代码如何跑起来
作为一名java开发的程序员 , 我们平时做了各种各样的系统 , 但是我们有没有思考过 , 我们的程序是如何跑起来的呢?平时我们做项目的流程 , 无非编写一些java代码 , 然后打包成war包或者jar包 , 通过tomcat部署或者java -jar命令 , 然后就跑起来了 。我们用下图来了解一下这个流程:
加载|我们的java程序如何跑起来
文章图片

文章图片

是的 , 我们把我们写的java文件打包编译成class文件 , 然后通过java -jar启动一个jvm进程 , 将这些class字节码加载到我们的jvm内存中 , 然后就运行起来了 。
2、jvm如何加载class字节码
上文提到将class字节码加载到jvm内存中 , 其实就是一个类加载过程 。那么我们的类加载过程是怎么样的呢?一般来说 , 我们一个类从加载到使用 , 都会经历一下几个过程:
加载|我们的java程序如何跑起来
文章图片

文章图片

那么第一个问题就来了 , 类是什么时候加载到内存的 , 它的入口是什么?当然 , 当我们启动一个jvm进程时 , 类就会加载到内存中 , 并且在类中找到main方法 , 这个就是入口 , 从而开始加载你的程序 , 以下面这个程序为例:
加载|我们的java程序如何跑起来
文章图片

文章图片

当启动jvm进程后 , 就会把Main.class文件加载到内存中 , 并且找到main方法 , 开始执行程序 。当开始执行的时候 , 发现需要用到User对象实例 , 那么就会把User.class字节码加载到内存中来 。用下面图表示:
加载|我们的java程序如何跑起来
文章图片

文章图片

其实上面就是一个加载的过程 , 接下来我们来看一下验证的过程 。所谓验证 , 就是你加载到内存进来的class文件 , 要先校验是否符合jvm规范 , 符合了才能交给jvm去运行 , 用下面的图表示一下:
加载|我们的java程序如何跑起来
文章图片

文章图片

校验通过后 , 就进入准备阶段 , 所谓的准备 , 就是为你即将用到的对象分配内存空间 , 比如我们要用到User对象 , 那么就会为User对象分配内存空间 。这个过程用下图表示:
加载|我们的java程序如何跑起来
文章图片

文章图片

准备阶段过后 , 就进入了解析阶段 , 所谓解析 , 就是把符号的引用替换成直接引用的过程 , 用下图表示:
加载|我们的java程序如何跑起来
文章图片

文章图片

解析过后 , 就进入初始化阶段 , 一般初始化的时机有两个:第一个是含有main方法会被立即初始化、第二个是出现new比如我们这个简单程序中的new User() 。其实我们在准备的阶段对象并没有真正实例化 , 只是分配了内存 , 真正的实例化是在初始化阶段 , 会把对象创建出来 。用下图表示:
加载|我们的java程序如何跑起来
文章图片


推荐阅读