一、 Java程序执行过程
- Java源码由Java编译器编译成Java字节码文件.class
- 由JVM类加载器加载各个字节码文件到运行时数据区
- 交给JVM执行引擎执行
- 用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间叫运行时数据区,也称JVM内存(分配和回收内存空间就是在这里)
二、运行时数据区
五个部分:Java栈、本地方法栈、堆、程序计数器和方法区
1. Java栈
也就是常说的虚拟机栈,是线程私有的,虚拟机栈描述的是Java方法执行的内存模型:每个方法执行时,
都会创建一个栈帧(每一个方法从调用到执行完成,就对应一个栈帧在虚拟机栈中的入栈和出栈的过程),包含如下几部分:
- 局部变量表:存放当前线程调用方法的局部变量(数据或引用)
- 操作数栈:存放操作数
- 指向运行时常量的引用:存放运行时常量引用
- 方法出口
2. 本地方法栈
本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行Native
方法服务的。
Native方法指的就是Java程序调用了非Java代码,算是一种引入其它语言程序的接口。
3. 堆
存储对象和数组,堆唯一。JDK7以后,常量池从方法区里移到了堆中。(下一篇介绍String常量池)
4. 程序计数器
也称PC寄存器。保存程序当前执行指令的地址,CPU得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址。
每条线程都有一个独立的程序计数器。
5. 方法区
方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。