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

秋招后端开发面试题 - JVM运行时数据区


目录

  • 运行时数据区
    • 前言
    • 面试题
      • JVM 内存区域 / 运行时数据区?
      • 说一下 JDK1.6、1.7、1.8 内存区域的变化?
      • 为什么使用元空间替代永久代作为方法区的实现?
      • Java 堆的内存分区了解吗?
      • 运行时常量池?
      • 字符串常量池了解吗?
      • 为什么将字符串常量池移动到堆中?


运行时数据区

前言

已经找到工作了,分享秋招时的笔记。祝大家都能顺利找到自己心仪的工作。


面试题

JVM 内存区域 / 运行时数据区?

image-20230315161815980

JVM 运行时数据区包括程序计数器、虚拟机栈、本地方法栈、堆、方法区
程序计数器、虚拟机栈、本地方法栈是线程私有的,堆和方法区是线程共享的

程序计数器:

  • 程序计数器是当前线程所执行的字节码的行号指示器
  • 是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError/OOM 情况的区域

虚拟机栈:

  • 描述 Java 方法执行的线程内存模型
  • 每个方法被执行时会创建一个栈帧,用于存储局部变量表、操作数栈等信息
  • 虚拟机栈是线程私有的,生命周期与线程相同
  • 异常情况:如果栈深度超过虚拟机允许的深度,会抛出 StackOverflowError 异常;如果栈容量扩展失败,会抛出 OutOfMemoryError 异常

本地方法栈:

  • 与虚拟机栈类似,但为虚拟机使用的本地 Native 方法服务

堆:

  • 堆是线程共享的,存放对象实例,几乎所有对象实例都在堆上分配
  • 通过参数 -Xmx 和 -Xms 设置堆的大小
  • 在 Java 堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)以提升对象分配效率
  • 细分为新生代(Eden 区、Survivor 区 S0 和 S1)和老年代
  • 如果 Java 堆没有足够内存进行实例分配且无法再扩展,会抛出 OutOfMemoryError 异常

方法区:

  • 用于存储已加载的类型信息、常量、静态变量等数据
  • 和 Java 堆一样,是线程共享的
  • 在 JDK8 之前,方法区的实现为永久代,JDK8 之后为元空间

说一下 JDK1.6、1.7、1.8 内存区域的变化?

在 JDK 1.6、1.7 和 1.8 版本中,内存区域的变化主要体现在方法区的实现方式上

  • JDK1.6: 方法区的实现是永久代
  • JDK1.7: 讲字符串常量池和静态变量从永久代中移到堆
  • JDK1.8 去除永久代的概念,使用元空间;在直接内存划分区域作为元空间,运行时常量池、类常量池都移动到元空间

为什么使用元空间替代永久代作为方法区的实现?

  • 永久代是固定大小的,无法动态调整;元空间使用本地内存作为存储区域,可以根据系统的物理内存动态调整大小

Java 堆的内存分区了解吗?

  • 按照垃圾收集,将 Java 堆划分为新生代和老年代
  • 新生代存放存活时间短的对象,每次回收后存活的少量对象,逐步升到老年代
  • 新生代分为三个区域:Eden、S1、S2,比例是 8:1:1

运行时常量池?

  • 运行时常量池是方法区的一部分
  • 常量池表:用于存放编译器生成的字面量和符号引用,在类加载后存放到方法区的运行时常量池中
  • 具有动态性,不要求常量一定只有编译期才能产生
  • 常量池在无法申请到内存时会抛出 OutOfMemoryError 错误

字符串常量池了解吗?

  • 字符串常量区是 JVM 为了提高性能和较少内存消耗针对字符串类专门开辟的一块区域
  • 为了避免字符串的重复创建
// 在堆中创建字符串对象”ab“
// 将字符串对象”ab“的引用保存在字符串常量池中
String aa = "ab";
// 直接返回字符串常量池中字符串对象”ab“的引用
String bb = "ab";
System.out.println(aa==bb);// true

为什么将字符串常量池移动到堆中?

  • 因为方法区的 GC 回收效率太低,只有在整堆收集 (Full GC) 时才会执行 GC
  • Java 程序中通常有大量的字符串等待回收,将字符串常量池放在堆里,能够更加高效的回收字符串内存

秋招后端开发面试题系列目录
一、Java
1.1 Java基础上
1.2 Java基础下
1.3 Java集合
1.4 JavaIO
1.5 Java多线程上
1.6Java多线程下
二、JVM
2.1 JVM底层原理
2.2 垃圾回收器
2.3 垃圾回收算法
2.4 类加载机制
2.5 运行时数据区
三、MySQL
3.1 MySQL基础
3.2 事务
3.3 索引
3.4 锁机制
3.5 MVCC
四、Redis
4.1 Redis基础
4.2 缓存原理
五、中间件
5.1 RabbitMQ
六、Spring开源框架
6.1 Spring
6.2 Spring MVC
6.3 Spring Boot
6.4 MyBatis
七、操作系统
八、计算机网络
九、设计模式
十、微服务架构
十一、Spring Cloud分布式
11.1 分布式基础
11.2 Spring Cloud
11.3 GateWay
11.4 Nacos
11.5 OpenFeign
11.6 Ribbon
十二、算法
十三、项目

http://www.lryc.cn/news/347958.html

相关文章:

  • 【YOLOv8改进[Backbone]】使用SCINet改进YOLOv8在黑暗环境的目标检测效果
  • ASE docker related research
  • maven .lastUpdated文件作用
  • gtest的编译与使用
  • 【 npm详解:从入门到精通】
  • 【Web后端】实现文件上传
  • react 逻辑 AND 运算符 ()
  • Redis详解(二)
  • 嵌入式:基于STM32的智能家居照明控制系统
  • 三种基本排序-冒泡,选择,二分
  • windows查找重复的物理地址
  • linux进阶高级配置,你需要知道的有哪些(8)-shell脚本应用(三)
  • 安全测试|常见SQL注入攻击方式、影响及预防
  • 【Git】Git在Gitee上的基本操作指南
  • 国债期货怎么买?十年国债交易手册
  • 公司申请增加公众号数量
  • 什么是.faust勒索病毒?应该如何防御?
  • 邓闲小——生存、生活、生命|真北写作
  • 品牌舆情都包含什么内容?建议收藏
  • MQTT 5.0 报文解析 04:PINGREQ 与 PINGRESP
  • 【算法刨析】完全背包
  • notepad++
  • Python ValueError: bad transparency mask
  • Linux本地部署Nightingale夜莺监控并实现远程访问提高运维效率
  • 开关电源功率测试方法:输入、输出功率测试步骤
  • QT 文字转语言插件
  • Kubernetes(k8s)的认证(Authentication)策略解析
  • Scikit-Learn决策树
  • Python面试题【python基础部分1-50】
  • 鸿蒙内核源码分析(Shell编辑篇) | 两个任务,三个阶段