一、JVM 启动流程
- 执行 java xxx 或 javaw xxx 命令
- 从系统环境变量或当前路径中找到和 java 或 javaw 关联的程序并运行
- java 或 javaw 程序找到 jvm.cfg 配置文件并且对 jvm 进行初始化
- 找到 xxx 文件的 main 方法后开始运行
二、JVM 内存模型(粗略)
首先说明一下:
堆: 被所有线程共享的一块内存区域,在虚拟机启动时创建,用于存放对象实例
方法区: 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
Java 栈区: 线程私有,每调用一个方法都会产生一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息
三、class 文件加载执行流程
- 如图 1 ,jvm 中的类加载器(ClassLoader)把 class 文件加载到内存空间的方法区中
- 然后开启一个线程,并且为当前线程创建 Java 栈,每个线程都拥有一个 PC 寄存器(程序计数器),该寄存器的作用和计算机的 指令指针寄存器 有点像,用于指向下一条要执行的指令
- 执行引擎会对 Java 栈中的代码进行执行
- 在执行过程中涉及到的实例的创建时会进行内存分配的操作,大部分会在堆上做分配,后来 JIT 编译器发展后,也会在栈上分配内存
- 从第 1 步开始其实是从 jvm 启动后执行 class 的 main 方法的步骤,如果已经有一个线程在运行,需要加载一个 class 文件,则用 ClassLoader 装载进 方法区 ,然后执行创建实例、方法调用、创建栈帧的一个循环的过程