「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
JVM虚拟机
区域划分
在虚拟机内部,就像人体的器官一样,有着各种各样的区域划分,它们各思其职,将你所✍的程序代码按照你的逻辑执行。让我们看看有哪些区域:
存放类的方法区 Metaspace(元空间、方法区)
类似于常量池一样的东西 存放kafka.class、ReplicManager.class等
程序计数器
记录着当前执行的字节码指令的位置,我们的代码会被解析成字节码,对应不同的字节码指令,由字节码执行引擎去执行
Java 虚拟机栈
记录每个方法内的局部变量,每个线程都有自己的虚拟机栈 其中有对应的栈帧,记录着这个方法的局部变量表、操作数栈、动态链接、方法出口...
Java 堆内存
存放我们代码中创建的各种对象实例
先看一段简单的代码
public class kafka{
public static main(){
RelicaManager relicaManager = new RelicaManager();
relicaManager.loadReplicasFromDisk();
}
}
public class ReplicManager{
private long replicaCount;
public void loadReplicasFromDisk(){
Boolean hasFinishedLoad = false;
if(isLOcalDataCourrupt()){System.out.print("test!!!")}
}
public void isLOcalDataCourrupt(){
Boolean isCorrupt = false;
return isCorrupt;
}
}
虚拟机栈与堆内存的关系
本地方法栈
与C语言有关,不理解
总结一下
总结一下: 将编译好的Class 文件,经过类加载器的类加载过程,进入到JVM 的 方法区中,其中编译好的字节码,由我们虚拟机中的字节码执行引擎执行,而具体执行到哪一行呢,需要由我们的程序计数器来记录,一些方法,主方法入口,由我们的虚拟机栈记录位置,栈先进后出嘛,其中一些局部变量引用了存放在堆内存中已经实例化的对象。
不难从图中看出,线程私有的区域有程序计数器、虚拟机栈。