面试复习java执行流程

复习下,java的运行流程,简单来说一个java的运行需要编辑源码、编译生成class文件、解释或编译运行class的字节码指令。 这里主要是讲编译后的运行情况,示例代码如下

代码

class Student{
    private Integer id;
    private String name;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}


public class App {
    public static void main(String[] args) throws Exception {
        Student s = new  Student();
        s.setId(1);
        s.getId();
    }
}

简单编译下,命令如下

javac  App.java

java的内存分配

在了解运行流程之前,我们先了解java虚拟机运行时的内存分配,如下图 内存分配

反编译字节码可以看到命令执行过程

javap -v App

得出下图 反编译字节码

把输出打印到txt文件,命令如下

javap -v  App > App.class.txt

反编译字节码

还可以利用字节码查看器jclasslib来查看,地址如下 https://github.com/ingokegel/jclasslib

java运行流程图

编译成class--->|加载--->验证--->准备--->解析--->初始化|-main在jvm虚拟机栈内存中创建栈帧, 栈帧中局部变量表,操作数栈、动态连接和方法返回地址。 局部变量表,用于存放方法参数和方法内部定义的局部变量。 操作数栈操作栈,它是一个后入先出栈 动态连接,每个栈帧都包含一个指向运行时常量池。 反编译字节码

1)类加载器会把指定的classpath中找到App.class这个文件,然后读取字节流中的数据,放到方法区
2)会根据App.class的信息创建一个Class对象,这个对象比较特殊,一般也放到方法区中
3)必要的验证工作,格式,语义等
4)为App中静态字段分配内存,同样是在方法区中,并进行零初始化
5)因为已经加载到内存中了,之前的文件中存放的符号引用解析为内存的直接引用
6)在编译阶段,编译器自动收集类中的所有类变量的赋值动作和静态语句块,并按语句出现的顺序拼接出一个类初始化方法()。 此时,执行引擎会调用这个方法对静态字段进行程序员意愿的初始化操作。
7)执行引擎找到main方法,执行字节码指令,程序计数器记录条数,创建一个栈帧,栈帧中局部变量表存放参数和局部变量。
8)执行一个指令,相应的在操作数栈有相应的表示,方法执行完成出栈。

运行期间的垃圾回收机制

一般是系统等到新生代的内存区占满了又需要分配内存的时候,这个时候新生代就变成了老年代,等老年代的内存占满之后开始回收老年代所占的内存区。

面试相关

JVM的内存区域 对象创建的过程 回收垃圾

参考

《深入理解java虚拟机》第三版
https://www.cnblogs.com/dqrcsc/p/4671879.html
https://www.bilibili.com/video/BV1yE411Z7AP?p=109
https://mp.weixin.qq.com/s/_7dw4BPcaa3JAVoFdIS2fw

评论已关闭