之前学java时也听过JVM这个名字,但对它的了解仅限于很简单基础的少量概念,最近由于技术菜引发的中度持续性焦虑,令我开始将目光聚集在互联网上技术大佬的博客。机缘巧合之下,找到了一套讲解JVM的系列文章,貌似并不是很长,预计学习成本并不高,正好借此机会对JVM进行更深入的了解,在学习的同时整理出一套自己的学习笔记,记录一下自己的学习过程,同时也是为了以免过段时间大脑数据丢失。
线程独享数据区
PC寄存器
首先,作者在文章中介绍到了java虚拟机是支持多线程的,每一个线程都有自己的PC寄存器,在任意时刻,一个线程只会执行一个方法的代码,正在被线程执行的方法称为线程的当前方法。
到目前为止都比较好理解,然后就提出了一些我比较陌生的概念。
当前方法不为native时,也就是非本地方法,PC寄存器的作用就是存储它经JVM汇编后字节码指令的地址,否则存储的值为undefined。
记得学习java之初就接触过,java的代码并不能直接执行,而是要经过编译为字节码然后执行(后期又接触到貌似字节码还要变为机器码,而字节码也是实现跨平台的关键,大概是一种中间语言?),之后也偶尔接触到了一点字节码指令,所以文章中的这一段也不算难理解。
java虚拟机栈
java虚拟机栈的元素称为栈帧,栈帧在线程调用方法时被创建,用于存储局部变量表、操作栈、动态链接、方法出口等信息。
方法被调用,栈帧入栈,方法调用完成,栈帧出栈。
java虚拟机栈的生命周期与线程相同。
局部变量表:
局部变量的列表。
操作数栈:
供计算使用(让我想起了之前接触到的一道有关自增运算的java基础题)。
动态链接:
指向常量池的引用。
方法出口:
负责回复调用者。
在一条线程之中,只有目前正在执行的方法的栈帧是活动的。这个栈帧就被称为是当前栈帧,这个栈帧对应的方法就被称为是当前方法,定义这个方法的类就称作当前类。
本地方法栈
一般在线程创建时按线程分配,用于存储线程调用本地方法时,本地方法的局部变量表、操作数栈等信息。
线程共享数据区
堆
是所有线程共享的内存区域,用于存放对象实例,在虚拟机启动时创建。
方法区
用于存储类的结构信息。