当前位置: 首页 > article >正文

面试题解,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运行时数据区的内存分布,局部变量存储在虚拟机栈的栈帧中,更具体的说,就是存储在栈帧的局部变量表中


http://www.kler.cn/a/461741.html

相关文章:

  • VScode SSH 错误:Got bad result from install script 解決
  • 3 抢红包系统
  • 美的空气净化器好用吗?拾梧、美的、戴森空气净化器除烟哪个好?
  • Git 仓库与文件管理笔记
  • 在Linux中,如何查看和修改网络接口配置?
  • Navicat 17 for Mac 数据库管理软件
  • 【杂谈】-快速了解协作机器人
  • 推荐5款局域网IP扫描工具,支持电脑+Android!
  • 什么是递归解析服务器?它有什么特点
  • 正则表达式中,`$1` 是一个反向引用(backreference),它代表了匹配过程中捕获的第一个子表达式(即第一个括号内的内容)
  • 速盾:服务器CDN加速解析的好处有哪些呢?
  • leetcode热题100(79. 单词搜索)dfs回溯 c++
  • JWT包中的源码分析【Golang】
  • 解决uniapp H5页面限制输入框只能输数字问题
  • protobuf: 通讯录2.1
  • 生成文本格式日历的Python程序
  • SwanLab x LLaMA Factory:国产开源AI训练工具组合拳(含教程)
  • 如何使用Python生成词云图:结合`wordcloud`、`imageio`、`collections`和`jieba`分词模块
  • Excel VBA 自动填充空白并合并相同值的解决方案
  • 1.计算机英语
  • Spring boot对接安全证书
  • 通过 4 种方法将数据从 OnePlus 传输到Android
  • JavaScript中的JSON是什么
  • 【我的 PWN 学习手札】IO_FILE 之 劫持vtable
  • 24.01.01 MyBatis
  • 1.梳理一下neo4j的安装的过程以及错误