加载|我们的java程序如何跑起来
1、我们的代码如何跑起来
作为一名java开发的程序员 , 我们平时做了各种各样的系统 , 但是我们有没有思考过 , 我们的程序是如何跑起来的呢?平时我们做项目的流程 , 无非编写一些java代码 , 然后打包成war包或者jar包 , 通过tomcat部署或者java -jar命令 , 然后就跑起来了 。我们用下图来了解一下这个流程:
文章图片
文章图片
是的 , 我们把我们写的java文件打包编译成class文件 , 然后通过java -jar启动一个jvm进程 , 将这些class字节码加载到我们的jvm内存中 , 然后就运行起来了 。
2、jvm如何加载class字节码
上文提到将class字节码加载到jvm内存中 , 其实就是一个类加载过程 。那么我们的类加载过程是怎么样的呢?一般来说 , 我们一个类从加载到使用 , 都会经历一下几个过程:
文章图片
文章图片
那么第一个问题就来了 , 类是什么时候加载到内存的 , 它的入口是什么?当然 , 当我们启动一个jvm进程时 , 类就会加载到内存中 , 并且在类中找到main方法 , 这个就是入口 , 从而开始加载你的程序 , 以下面这个程序为例:
文章图片
文章图片
当启动jvm进程后 , 就会把Main.class文件加载到内存中 , 并且找到main方法 , 开始执行程序 。当开始执行的时候 , 发现需要用到User对象实例 , 那么就会把User.class字节码加载到内存中来 。用下面图表示:
文章图片
文章图片
其实上面就是一个加载的过程 , 接下来我们来看一下验证的过程 。所谓验证 , 就是你加载到内存进来的class文件 , 要先校验是否符合jvm规范 , 符合了才能交给jvm去运行 , 用下面的图表示一下:
文章图片
文章图片
校验通过后 , 就进入准备阶段 , 所谓的准备 , 就是为你即将用到的对象分配内存空间 , 比如我们要用到User对象 , 那么就会为User对象分配内存空间 。这个过程用下图表示:
文章图片
文章图片
准备阶段过后 , 就进入了解析阶段 , 所谓解析 , 就是把符号的引用替换成直接引用的过程 , 用下图表示:
文章图片
文章图片
解析过后 , 就进入初始化阶段 , 一般初始化的时机有两个:第一个是含有main方法会被立即初始化、第二个是出现new比如我们这个简单程序中的new User() 。其实我们在准备的阶段对象并没有真正实例化 , 只是分配了内存 , 真正的实例化是在初始化阶段 , 会把对象创建出来 。用下图表示:
文章图片
推荐阅读
- 北京亦庄|北斗又有新应用!原来带给我们的不只是导航
- 新华社新闻|10年间,智能手机这样改变我们的生活
- 手机|当手机失窃信息被盗后我们应该怎么办?
- 智能穿戴|虽说取消3.5毫米耳机孔会如此便捷,但是这些便捷我们真用得上?
- 超能网|本文约 800 字,4 张图表,正努力加载…
- 情感|爱情里, 没有百分之百的爱人
- 打印机打印|买不到RTX3080不要慌,我们用3D打印机打印一个
- 车驰夜幕|断供瓦解,国产高端芯片真的来了,英媒:我们的芯片将一文不值
- 电脑屏幕|电脑屏幕有雪花怎么回事
- 科学|银河系中可能存在高达60亿颗类地行星