徐无忌深入JVM虚拟机笔记:Java代码到底是如何运行起来的?

完成:第一遍

1.Java代码到底是如何运行起来的?

Demo.java编写的源文件
打包成:Jar包即Demo.class
通过Java-jar运行即是Java系统,把类名放入,执行main()方法

或者线上程序想部署后台应用程序:
经常代码打包成war包,
将war包放入Tomcat中,后运行

运行过程:
第一步:编译
第二步:类加载
第三步:链接
第四步:初始化

2.编译过程做了什么?

写好“.java”代码后,会通过编译器将代码编译成.class后缀的字节码文件

Java是与平台无关的,实现语言无关性的基础就是虚拟机和字节码存储格式

只要编译器按照虚拟机规范,编译成对应的class文件,这个class文件就能够被JVM加载。不同的操作系统通过运行对应版本JVM来载入这个class文件运行,则实现了平台无关性

3.类加载过程做了什么?

通过类加载器,可以把编译好的那些class字节码文件给加载到JVM中

4.链接过程做了什么?

在类被加载后,需要通过链接过程将它合并到JVM的运行状态之中,然后才可以开始使用。

链接包括三个步骤:
验证
准备
解析

5.链接中的验证步骤做了什么?

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

所以在类加载到之后,真正使用之前,必须先对其验证下,校验它必须完全符合JVM规范,后续才能交给JVM来运行

6…链接中的准备步骤做了什么?

准备过程中,会为类分配内存空间,JDK8中将类信息放到元空间中如static静态变量,给内部的类变置分配内存空间并设置默认的初始值

准备过程并不会执行代码

7.链接中的解析步骤做了什么?

解析的过程要确保这些被引用的类能被正确的找到,这个过程可能会导致其它的Java类被加载

8.初始化步骤做了什么?

初始化过程的主要操作是执行静态代码块和初始化静态变量,按照源代码中从上到下的顺序依次执行

一个类被初始化之前,它的直接父类也需要被初始化
一个接口的初始化,不会引起其父接口的初始化