秋招后端开发面试题 - 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.hqwc.cn/news/671897.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】如何获得TMP Button下的text内容

【背景】 unity项目中使用了TMP命名空间的Button UI组件。脚本中需要获得Button下Text的内容,但是发现用TextMeshPro仍然无法获得button下的text对象。 【分析】 Hierarchy结构上看明确Button下是有Text组件的: 括号里是TMP,所以理论上用TextMeshPro类型去FindComponent…

限量背包问题

问题描述 限量背包问题:从m个物品中挑选出最多v个物品放入容量为n的背包。 问题分析 限量背包问题,可以用来解决许多问题,例如要求从n个物品中挑选出最多v个物品放入容量为m的背包使得背包最后的价值最大,或者总共有多少种放法…

这是用VS写的一个tcp客户端和服务端的demo

服务端: 客户端: 其实这里面的核心代码就两行。 客户端的核心代码: //套接字连接服务端 m_tcpSocket->connectToHost(_ip,_port);//通过套接字发送数据m_tcpSocket->write(ui.textEditSend->toPlainText().toUtf8());//如果收到信…

【LLM第四篇】名词解释:SFT

看到京东的一段开场白,觉得很有道理: 2023年,大语言模型以前所未有的速度和能力改变我们对智能系统的认知,成为技术圈最被热议的话题。但“百模大战”终将走向“落地为王”,如何将大语言模型的强大能力融入实际业务、…

国内首发 | CSA大中华区启动《AI安全产业图谱(2024)》调研

在人工智能(AI)技术的快速发展浪潮中,AI安全已成为全球关注的焦点。为应对AI安全带来的挑战,确保AI技术的健康发展,全球范围内的研究机构、企业和技术社区都在积极探索解决方案。 在这一背景下,CSA大中华区…

软考中级-软件设计师(九)数据库技术基础 考点最精简

一、基本概念 1.1数据库与数据库系统 数据:是数据库中存储的基本对象,是描述事物的符号记录 数据库(DataBase,DB):是长期存储在计算机内、有组织、可共享的大量数据集合 数据库系统(DataBas…

14【PS作图】像素画尺寸大小

【背景介绍】本节介绍像素图多大合适 下图是160*144像素大小,有一个显示文本的显示器,还有一个有十几个键的键盘 像素画布尺寸 电脑16像素,但还有一个显示屏 下图为240*160 在场景素材,和对话素材中,用的是不同尺寸的头像,对话素材中的头像会更清楚,尺寸会更大 远处…

docker的commit命令使用制作镜像

docker run -it ubuntu 最基础的ubuntu启动后安装vim 的命令 apt-get update apt-get -y install vim docker commit -m"my_test_ubuntu" -a"za" 80977284a998 atljw/myubuntu:1.0 将本地镜像推送到阿里云 首先登录阿里云服务-控制台 记得一定要设定设…

APScheduler定时器使用【重写SQLAlchemyJobStore版】:django中使用apscheduler,使用mysql做存储后端

一、环境配置 python3.8.10 包: APScheduler3.10.4 Django3.2.7 djangorestframework3.15.1 SQLAlchemy2.0.29 PyMySQL1.1.0 项目目录情况 gs_scheduler 应用 commands : 主要用来自定义命令,python manage.py crontab schedulers&#…

(网络初识)

网络发展史 独立模式 在最开始计算机被发明出来,但网络还未普及的情况下,每个计算机之间都是相互独立的: 假设现在有一份数据需要处理,然后这份数据的处理又分给三个人分别处理。假设小松处理进行第一部分的处理,当小…

Chromium编译指南2024 Windows11篇-配置depot_tools工具(二)

前言 在《Chromium编译指南2024(一)》我们探讨了Chromium编译前的准备工作和Visual Studio安装。 接下来,我们将详细介绍如何下载、解压并配置depot_tools工具,以便顺利进行后续的开发工作。 1. 下载解压depot_tools 包 下载d…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…