hooyantsing's Blog

0x000C-JVM内存结构

2023/08/03

面试回答

JVM 内存结构主要分 5 块,线程隔离的有程序计数器、虚拟机栈和本地方法栈,线程共享的有方法区和堆。

程序计数器用于记录程序当前执行的位置;虚拟机栈用于保存方法调用关系;本地方法栈用于保存本地方法调用关系,与虚拟机栈类似;方法区用于存放类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据;堆用于存放对象实例。

问题详解

JVM 内存结构

JVM内存结构

  • 程序计数器:程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器,程序计数器记录着某个线程当前执行指令的位置;
  • 虚拟机栈:每调用一个方法都会生成一个新的栈帧,调用方法的过程就是一个压栈和出栈的过程,遵循先进后出的原则;
  • 本地方法栈:由于java需要与一些底层系统如操作系统或某些硬件交换信息时的情况,这个时候就需要通过调用native本地方法来实现,本地方法栈和虚拟机栈功能差不多,区别在于本地方法栈是虚拟机调用native方法时使用的。在 HotSpot 虚拟机中和虚拟机栈合二为一
  • 方法区:JVM方法区是用于保存已经被虚拟机加载的类元信息(包括类的版本、字段、方法、接口和父类等信息)、运行时常量信息(static、final定义的常量)、字符串常量信息(String a=”dfc”)。Java8 版本 Hotspot 虚拟机实现名元数据(MetaSpace)
  • 堆:堆内存主要是用来存放创建的对象数据。

虚拟机栈的栈帧内存结构

栈帧内存结构

  • 局部变量表:保存着变量的数据;
  • 操作数栈:进行运算时存放数据的空间;
  • 动态连接:指向常量池的引用;
  • 方法返回地址:当前方法返回后的数据存放的地方。

堆内存结构

Java8

堆内存结构

参考阅读

CATALOG
  1. 1. 面试回答
  2. 2. 问题详解
    1. 2.1. JVM 内存结构
      1. 2.1.1. 虚拟机栈的栈帧内存结构
      2. 2.1.2. 堆内存结构
  3. 3. 参考阅读