梳理 JVM 核心内存区域的功能:
- 方法区:存放加载的类的信息的;
- 程序计数器:记录当前这个线程目前执行到了哪一条字节码指令了;
- Java 虚拟机栈:保存每个线程都会有一个自己的 java 虚拟机栈,用来存放自己执行的那些方法的局部变量等数据;
- 栈帧:线程每执行一个方法,都会创建一个栈帧用来保存方法的局部变量、操作数栈、方法出口等数据,并将栈帧压入线程的 java 虚拟机栈;
- Java 堆内存:存放我们在代码中创建的各种对象
核心内存区域的全流程串讲
public class kafka {
public static void main(){
ReplicaManager replicaManager = new ReplicaManager();
replicaManager.loadReplicasFromDish();
}
}
public class ReplicaManager {
private long replicaCount;
public void loadReplicasFromDish(){
Boolean hasFinishedLoad = false;
if(isLocalDataCorrupt()){}
}
public Boolean isLocalDataCorrupt(){
Boolean isCorrupt = false;
return isCorrupt;
}
}
- 使用 java -jar 运行 jar 包时,会创建一个 JVM 进程运行你的应用;
- JVM 进程启动时,会立马加载含有 main 方法的主类 Kafka,将类信息保存在方法区;
- 创建一个 main 线程,开始执行 Kafka 中的 main() 方法;
- main 线程会关联一个程序计数器,记录线程执行到哪一行指令;
- main 线程会关联一个 Java 虚拟机栈,创建并压入一个 main() 方法的栈帧;
- main() 方法中遇到需要创建一个 ReplicaManager 类的实例对象,此时触发 ReplicaManager 类信息加载到方法区中;
- 创建一个 ReplicaManager 对象实例保存在 Java 堆内存里,并且在 main() 方法的栈帧里的局部变量表引入一个 replicaManager 变量,让它引用 ReplicaManager 对象在 Java 堆内存中的地址;
- main 线程开始执行 ReplicaManager 对象中的方法,会依次将自己执行到的方法对应的栈帧压入自己的 Java 虚拟机栈,执行完方法之后,再把方法对应的栈帧从 Java 虚拟机里出栈。