面试回答
JVM 内存结构主要分 5 块,线程隔离的有程序计数器、虚拟机栈和本地方法栈,线程共享的有方法区和堆。
程序计数器用于记录程序当前执行的位置;虚拟机栈用于保存方法调用关系;本地方法栈用于保存本地方法调用关系,与虚拟机栈类似;方法区用于存放类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据;堆用于存放对象实例。
问题详解
JVM 内存结构
- 程序计数器:程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器,程序计数器记录着某个线程当前执行指令的位置;
- 虚拟机栈:每调用一个方法都会生成一个新的栈帧,调用方法的过程就是一个压栈和出栈的过程,遵循先进后出的原则;
- 本地方法栈:由于java需要与一些底层系统如操作系统或某些硬件交换信息时的情况,这个时候就需要通过调用native本地方法来实现,本地方法栈和虚拟机栈功能差不多,区别在于本地方法栈是虚拟机调用native方法时使用的。在 HotSpot 虚拟机中和虚拟机栈合二为一;
- 方法区:JVM方法区是用于保存已经被虚拟机加载的类元信息(包括类的版本、字段、方法、接口和父类等信息)、运行时常量信息(static、final定义的常量)、字符串常量信息(String a=”dfc”)。Java8 版本 Hotspot 虚拟机实现名元数据(MetaSpace);
- 堆:堆内存主要是用来存放创建的对象数据。
虚拟机栈的栈帧内存结构
- 局部变量表:保存着变量的数据;
- 操作数栈:进行运算时存放数据的空间;
- 动态连接:指向常量池的引用;
- 方法返回地址:当前方法返回后的数据存放的地方。
堆内存结构
Java8