深入理解JVM内存模型

一、 Java程序执行过程

  1. Java源码由Java编译器编译成Java字节码文件.class
  2. 由JVM类加载器加载各个字节码文件到运行时数据区
  3. 交给JVM执行引擎执行
  4. 用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间叫运行时数据区,也称JVM内存(分配和回收内存空间就是在这里)

二、运行时数据区

五个部分:Java栈、本地方法栈、堆、程序计数器和方法区

1. Java栈

       也就是常说的虚拟机栈,是线程私有的,虚拟机栈描述的是Java方法执行的内存模型:每个方法执行时,

都会创建一个栈帧(每一个方法从调用到执行完成,就对应一个栈帧在虚拟机栈中的入栈和出栈的过程),包含如下几部分:

  • 局部变量表:存放当前线程调用方法的局部变量(数据或引用)
  • 操作数栈:存放操作数
  • 指向运行时常量的引用:存放运行时常量引用
  • 方法出口

2. 本地方法栈

本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行Native

方法服务的。

Native方法指的就是Java程序调用了非Java代码,算是一种引入其它语言程序的接口。

3. 堆

存储对象和数组,堆唯一。JDK7以后,常量池从方法区里移到了堆中。(下一篇介绍String常量池)

4. 程序计数器

也称PC寄存器。保存程序当前执行指令的地址,CPU得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址。

每条线程都有一个独立的程序计数器。

5. 方法区

方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

原文地址:https://www.cnblogs.com/yumingxing/p/9428658.html