面试题解,JVM的运行时数据区

一、请简述JVM运行时数据区的组成结构及各部分作用

总览

从线程持有的权限来看

线程私有区

虚拟机栈

虚拟机栈是一个栈结构,由许多个栈帧组成,一个方法分配一个栈帧,线程每执行一个方法时都会有一个栈帧 入栈,方法执行结束后栈帧出栈

栈帧又细分为局部变量表、操作数栈、动态连接、方法出口四个组成部分

  1. **局部变量表:**存放我们的局部变量的(方法内的变量)。首先它是一个32 位的长度,主要存放我们的 Java 的八大基础数据类型,一般 32 位就可以存放下,如果是 64 位的就使用高低位占用两个也可以存放下,如果是局部变量是一个对象,存放它的一个引用地址即可。
  2. **操作数栈:**存放 java 方法执行的操作数的。在方法执行的过程中,一些用于参与运算的操作数就会先加载到操作数栈,后面又把操作数栈的数取出来进行运算。
  3. **动态连接:**与多态相关
  4. **完成出口:**就是指该方法执行完毕,程序要回到哪个指令开始执行(程序计数器相当于存储了指令表,每个指令都在指定偏移量,根据偏移量定位到该执行哪一条指令),一般是回到调用该方法的程序计数器指令的位置去

本地方法栈

本地方法栈和虚拟机栈类似,具备线程隔离的特性,不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法,hotspot把它和虚拟机栈合并成了1个。

程序计数器

较小的内存空间,存储当前线程执行的字节码指令的偏移量(理解成位置);各线程之间独立存储,互不影响。

线程共享区

方法区

方法区是可供各线程共享的运行时内存区域,主要用来存储已被虚拟机加载的类信息、常量、静态变量、JIT编译器编译后的代码缓存等等,它有个别名叫做:非堆,主要是为了和堆区分开。

方法区中存储的信息大致可分以下两类:

  1. 类的元数据信息:包括类的版本、字段、方法、接口等描述信息。
  2. 字段和方法的数据:包括字段和方法的名称、访问标志(public, private, etc.)、参数列表、返回类型等。
  3. 静态变量 :类级别的变量,即用static关键字修饰的变量。
  4. **常量池:**用于存放编译期间生成的各种字面量(数值,字符串等)和符号引用(我的另外一篇博客有专门讲),这些引用会在类加载阶段或者运行期间解析为直接引用。

堆区

堆首先分为两部分,新生代和老年代

新生代又进一步划分为Eden区和两个survivor区

Java当中的绝大部分对象都存储在堆区,按照对象的内存分配策略,一些对象会被分配在堆区

当然了,每个对象也不是永久存在的,有一定生命周期,那么生命周期到了,如何进行对象内存回收?这就是JVM的GC机制

二、说说程序计数器的作用

首先,每个线程都有自己的程序计数器,这部分内存空间是线程私有的,生命周期与线程相同。

程序计数器的主要功能是指向当前线程正在执行的字节码指令的位置

具体来说:

  • 如果当前线程执行的是非本地方法(即不是native方法),那么程序计数器保存的是下一条要执行的字节码指令的地址。
  • 如果当前线程执行的是本地方法(native method),则程序计数器的值为空(undefined),因为此时的执行已经交给了底层系统或其他语言实现,不再受JVM控制。

由于程序计数器占用的内存资源极少,因此它是唯一一个不会出现OutOfMemoryError的运行时数据区域。

三、代码异常后如何执行?为什么finally总会被执行?

我们在程序中大致分为两类处理异常的手段,一种是直接抛出Throws,两一种是Try-Catch捕获

如果用了Try-Catch-finally,那么Try中的代码段和Catch中的代码段和finally都会分别解析成相应的字节码指令

那么try捕获到了异常,就会查找异常处理表,这个表会记录你哪里发生了异常该走到哪一条字节码指令去接着执行

如果有Catch,那就走到对应的Catch字节码指令去执行,如果没有Catch到相应的异常,但存在finally,那就走到finally对应的字节码指令位置执行

如果异常处理表没有记录,大概率就是直接Throws,那么会有系统异常来处理这些错误。

四、java内存区域?局部变量在哪?

java的内存区域,就是上面提到的jvm运行时数据区的内存分布,局部变量存储在虚拟机栈的栈帧中,更具体的说,就是存储在栈帧的局部变量表中

相关推荐
东阳马生架构14 小时前
JVM实战—9.线上FGC的几种案例
jvm
是程序喵呀21 小时前
JDK、JRE、JVM的区别
java·开发语言·jvm
崔庆权1 天前
1月2日作业
jvm·数据库·oracle
液态不合群1 天前
JVM实战—G1垃圾回收器的原理和调优
jvm
乔木剑衣1 天前
JVM学习:CMS和G1收集器浅析
java·jvm·学习·垃圾收集
东阳马生架构2 天前
JVM实战—8.如何分析jstat统计来定位GC
jvm
SJLoveIT2 天前
volatile关键字
java·开发语言·jvm
customer082 天前
【开源免费】基于SpringBoot+Vue.JS精准扶贫管理系统(JAVA毕业设计)
java·jvm·vue.js·spring boot·后端·spring cloud·maven
java_heartLake2 天前
JVM之后端编译
java·jvm·后端编译