Java程序运行过程
一、 过程图解
二、阶段分析
1)编译
在Java中指将**.java**文件转化为 .class文件(字节码文件)的过程。
其中这个字节码文件,真正的实现了跨平台、跨语言。因为JVM里运行的就是.class文件,只要符合这个格式就能运行。所以在任何平台,用任何语言只要你能把程序编译成字节码文件就能在JVM里运行。
例如 在源程序中有一个类叫User,一个接口叫Iner,编译后生成的是User.class Iner.class
在编译阶段,编译器收集所有的静态字段的赋值语句及静态代码块,并按语句出现的顺序拼接出一个类初始化方法()
2)加载
类加载器加载.class文件到内存:
-
类加载器会在指定的classpath中找到.class这些文件,然后读取字节流中的数据,将其存储在JVM方法区(了解JVM结构可以去https://blog.youkuaiyun.com/moneyshi/article/details/53033577)
-
根据.class的信息建立一个Class对象,作为运行时访问这个类的各种数据的接口(一般也在方法区)。
-
验证格式、语义等
-
为类的静态变量分配内存并设为JVM默认的初值,对于非静态的变量,则不会为它们分配内存。
静态变量的初值为JVM默认的初值,而不是我们在程序中设定的初值。
JVM默认的初值:
基本类型(int、long、short、char…)的默认值为0。
引用类型 null -
字节码文件中存放的部分方法、字段等的符号引用可以解析为其在内存中的直接引用,无需等到运行时解析。
-
此时,执行引擎会调用()方法对静态字段进行代码中编写的初始化操作。
3)执行
引擎寻找main()方法,执行其中字节码指令
对象实例会被放进JVM的java堆
一个线程产生一个java栈,当运行到一个方法就创建一个栈帧(包含局部变量表、操作栈、方法返回值),将它入栈,方法执行结束出栈。