JAVA | JVM笔记(二)

206 阅读2分钟

「这是我参与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 的 方法区中,其中编译好的字节码,由我们虚拟机中的字节码执行引擎执行,而具体执行到哪一行呢,需要由我们的程序计数器来记录,一些方法,主方法入口,由我们的虚拟机栈记录位置,栈先进后出嘛,其中一些局部变量引用了存放在堆内存中已经实例化的对象。

不难从图中看出,线程私有的区域有程序计数器、虚拟机栈。