「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
JVM是JavaVirtualMachine(Java虚拟机)的缩写,Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因
一、Java虚拟机运行时数据区
首先我们看一下java虚拟机运行时的数据区域图,这样更能直观理解
1. 栈(虚拟机栈)
它是线程私有的,生命周期和线程是一致的,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
1. 本地方法栈
和虚拟机栈类似,作用于native方法
1. 程序计数器
存储程序正在执行的指令,字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成
1. 方法区
属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
先大概介绍到这里,下节主要介绍栈帧