梳理 JVM 核心内存区域的功能:

  • 方法区:存放加载的类的信息的;
  • 程序计数器:记录当前这个线程目前执行到了哪一条字节码指令了;
  • Java 虚拟机栈:保存每个线程都会有一个自己的 java 虚拟机栈,用来存放自己执行的那些方法的局部变量等数据;
    • 栈帧:线程每执行一个方法,都会创建一个栈帧用来保存方法的局部变量、操作数栈、方法出口等数据,并将栈帧压入线程的 java 虚拟机栈;
  • Java 堆内存:存放我们在代码中创建的各种对象

核心内存区域的全流程串讲

  1. public class kafka {
  2. public static void main(){
  3. ReplicaManager replicaManager = new ReplicaManager();
  4. replicaManager.loadReplicasFromDish();
  5. }
  6. }
  7. public class ReplicaManager {
  8. private long replicaCount;
  9. public void loadReplicasFromDish(){
  10. Boolean hasFinishedLoad = false;
  11. if(isLocalDataCorrupt()){}
  12. }
  13. public Boolean isLocalDataCorrupt(){
  14. Boolean isCorrupt = false;
  15. return isCorrupt;
  16. }
  17. }

image.png

  • 使用 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 虚拟机里出栈。