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

JVM 面试

JVM 运行时内存区域划分是怎样的?

  • 程序计数器:记录当前线程执行的字节码指令的地址,是线程私有的。

  • Java 虚拟机栈:每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,是线程私有的。

  • 本地方法栈:与 Java 虚拟机栈类似,用于执行本地方法,是线程私有的。

  • :用于存储对象实例,是线程共享的。

  • 方法区:用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是线程共享的。在 JDK 1.8 中,方法区被元空间(Metaspace)取代,元空间使用本地内存。

常见的 GC 回收算法及其含义是什么?

  • 标记 - 清除算法:分为标记和清除两个阶段。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。该算法会产生大量的内存碎片。

  • 复制算法:将内存分为大小相等的两块,每次只使用其中一块。当这块内存满了时,将存活的对象复制到另一块内存中,然后清除原来的内存。该算法不会产生内存碎片,但会浪费一半的内存空间。

  • 标记 - 整理算法:在标记 - 清除算法的基础上,增加了整理的步骤。在标记阶段标记出所有需要回收的对象,清除阶段将存活的对象向一端移动,然后清除边界以外的内存,解决了内存碎片的问题。

  • 分代收集算法:根据对象的存活周期将内存划分为新生代和老年代。新生代采用复制算法,老年代采用标记 - 清除或标记 - 整理算法。

什么是类加载器?

类加载器是负责将字节码文件加载到 JVM 中,并将其转换为 Class 对象的组件。Java 中有三种类型的类加载器:

  • 启动类加载器(Bootstrap ClassLoader):负责加载 Java 核心类库,如 rt.jar,是用 C++ 实现的,无法被 Java 程序直接引用。

  • 扩展类加载器(Extension ClassLoader):负责加载 Java 的扩展类库,如 jre/lib/ext 目录下的类库。

  • 应用程序类加载器(Application ClassLoader):负责加载应用程序的类,如 classpath 下的类。

什么是双亲委派模型机制?

当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子类加载器才会尝试自己去加载。

一个类的生命周期是怎样的?类是如何加载到 JVM 中的?

  • 生命周期:加载、验证、准备、解析、初始化、使用、卸载。

  • 加载过程

    1. 加载:通过类加载器将字节码文件加载到内存中,生成一个 Class 对象。

    2. 验证:验证字节码文件的正确性,确保其符合 Java 虚拟机规范,包括文件格式验证、元数据验证、字节码验证和符号引用验证等步骤,防止恶意字节码对 JVM 造成危害。

    3. 准备:为类的静态变量分配内存,并设置默认初始值,如为整型变量赋 0,引用类型赋 null 。

    4. 解析:将常量池中的符号引用替换为直接引用,也就是把类、接口、字段和方法的符号引用转换为具体内存地址的直接引用,便于在运行时快速定位和访问这些元素。

    5. 初始化:执行类构造器<clinit>()方法,对静态变量进行显式赋值和执行静态代码块中的代码。<clinit>()方法是由编译器自动收集类中的所有静态变量的赋值动作和静态代码块中的语句合并产生的,并且在多线程环境下,JVM 会确保<clinit>()方法的线程安全性,一个类的<clinit>()方法在多线程环境下只会被执行一次。

说说类加载的过程?

类加载过程包含上述生命周期中的加载、验证、准备、解析、初始化这几个阶段:加载阶段通过类加载器查找并读取字节码文件,将其转化为内存中的 Class 对象;验证阶段全方位检查字节码的合法性和安全性;准备阶段为静态变量分配内存并赋予初始默认值;解析阶段将常量池中的符号引用替换为直接引用;初始化阶段执行<clinit>()方法,完成静态变量的显式赋值和静态代码块的执行。例如,当我们首次使用一个自定义类时,JVM 会按照这个顺序逐步完成类的加载,确保类在使用前已经被正确加载和初始化。

什么是强引用、软引用、弱引用、虚引用?

  • 强引用:最常见的引用类型,通过new关键字创建对象时就是强引用。只要强引用存在,垃圾回收器就不会回收被引用的对象。例如Object obj = new Object();,只要obj引用存在,对应的Object对象就不会被回收,哪怕内存不足也不会回收,可能导致 OOM。

  • 软引用:通过SoftReference类实现,在内存充足时,不会被回收;当内存不足时,会被回收。常用于实现内存敏感的缓存,比如缓存图片等大对象,在内存不够时,系统会优先回收这些软引用指向的对象,避免 OOM。

  • 弱引用:通过WeakReference类实现,无论内存是否充足,只要垃圾回收器扫描到,就会回收被弱引用指向的对象。常用于解决内存泄漏问题,例如在HashMap中,如果使用强引用作为key,当key不再使用但仍被HashMap引用时,可能导致内存泄漏,而使用弱引用作为key,在key不再被其他地方引用时,垃圾回收器会回收它,避免内存泄漏。

  • 虚引用:通过PhantomReference类实现,也叫幻影引用,它对对象的生命周期没有影响,无法通过虚引用来获取对象实例,主要用于在对象被回收时收到一个系统通知,例如用于管理堆外内存资源,当对象被回收时,可通过虚引用关联的引用队列来触发堆外内存的释放操作。

Minor GC 与 Full GC 分别在什么时候发生?

  • Minor GC:发生在新生代,当新生代的 Eden 区满了,无法存放新创建的对象时,就会触发 Minor GC。它会回收新生代中不再被引用的对象,由于新生代对象大多 “朝生夕灭”,所以 Minor GC 的频率较高,但回收速度相对较快。

  • Full GC:发生在老年代,常见的触发场景有老年代空间不足、方法区空间不足、显式调用System.gc() (不过System.gc()只是建议 JVM 进行 Full GC,JVM 不一定会立即执行)、大对象直接进入老年代且老年代空间不够时,以及在进行 Minor GC 时,动态年龄判断发现 Survivor 区中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,若老年代空间不足就会触发 Full GC。Full GC 会对整个堆(包括新生代和老年代)和方法区进行垃圾回收,回收速度相对较慢,因为老年代中的对象存活时间长,垃圾回收的成本更高。

什么时候触发 Full GC?

除了上述提到的老年代空间不足、方法区空间不足、显式调用System.gc() 、大对象直接进入老年代且老年代空间不够、Minor GC 时动态年龄判断导致老年代空间不足等情况外,还有以下情况:当 JVM 的堆内存使用率达到一定阈值(可通过参数设置,如-XX:HeapDumpOnOutOfMemoryError 结合-XX:OnOutOfMemoryError 等参数配合监控和触发相关操作),可能会触发 Full GC;在使用 CMS(Concurrent Mark Sweep)垃圾回收器时,如果在并发标记和清理阶段出现 Concurrent Mode Failure,即 CMS 在垃圾回收过程中,应用程序又产生了大量垃圾,导致老年代剩余空间无法容纳新的垃圾对象,也会触发 Full GC。

Java 中的大对象如何进行存储?

大对象通常指需要大量连续内存空间的对象,如大数组。在 Java 中,大对象一般会直接分配到老年代。因为新生代的空间相对较小,且使用复制算法,频繁地在新生代分配和回收大对象可能会导致大量的内存复制操作,影响性能。而老年代空间较大,并且采用标记 - 清除或标记 - 整理算法,更适合存储大对象。不过,当老年代空间不足时,就可能触发 Full GC 来回收老年代空间,以容纳大对象。此外,可以通过调整 JVM 参数(如-XX:PretenureSizeThreshold )来设置大对象直接进入老年代的阈值,当对象大小超过该阈值时,就直接在老年代分配内存。

为什么新生代内存需要有两个 Survivor 区?

新生代采用复制算法进行垃圾回收,两个 Survivor 区(一般称为 From Survivor 和 To Survivor)的设计是为了实现高效的垃圾回收。在每次 Minor GC 时,Eden 区和 From Survivor 区中存活的对象会被复制到 To Survivor 区,然后清空 Eden 区和 From Survivor 区。下次 Minor GC 时,From Survivor 区和 To Survivor 区的角色互换,即原来的 To Survivor 区变为 From Survivor 区,原来的 From Survivor 区变为 To Survivor 区。这样设计的好处是:一方面,避免了像标记 - 清除算法那样产生内存碎片;另一方面,通过复制存活对象,使得存活时间长的对象逐步晋升到老年代,因为每次复制时,对象的年龄(在 Survivor 区经历一次 Minor GC,年龄就加 1)会增加,当年龄达到一定阈值(默认为 15)时,对象就会被晋升到老年代,从而保证新生代的空间能够高效地利用,提高垃圾回收的效率。

相关文章:

JVM 面试

JVM 运行时内存区域划分是怎样的&#xff1f; 程序计数器&#xff1a;记录当前线程执行的字节码指令的地址&#xff0c;是线程私有的。 Java 虚拟机栈&#xff1a;每个方法在执行时都会创建一个栈帧&#xff0c;用于存储局部变量表、操作数栈、动态链接、方法出口等信息&#…...

智慧后勤的消防管理:豪越科技为安全护航

智慧后勤消防管理难题大揭秘&#xff01; 在智慧后勤发展得如火如荼的当下&#xff0c;消防管理却暗藏诸多难题。传统模式下&#xff0c;消防设施分布得那叫一个散&#xff0c;就像一盘散沙&#xff0c;管理起来超费劲。人工巡检不仅效率低&#xff0c;还容易遗漏&#xff0c;不…...

【Elasticsearch】(Java 版)

Elasticsearch&#xff08;Java 版&#xff09; 文章目录 Elasticsearch&#xff08;Java 版&#xff09;**1. Elasticsearch 简介****1.1 什么是 Elasticsearch&#xff1f;****1.2 核心概念** **2. 安装与配置****2.1 环境要求****2.2 安装步骤****Linux/macOS****Windows** …...

DeepSeek在昇腾上的模型部署 - 常见问题及解决方案

2024年12月26日&#xff0c;DeepSeek-V3横空出世&#xff0c;以其卓越性能备受瞩目。该模型发布即支持昇腾&#xff0c;用户可在昇腾硬件和MindIE推理引擎上实现高效推理&#xff0c;但在实际操作中&#xff0c;部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾Dee…...

安全面试5

文章目录 sql的二次注入在linux下&#xff0c;现在有一个拥有大量ip地址的txt文本文档&#xff0c;但是里面有很多重复的&#xff0c;如何快速去重&#xff1f;在内网渗透中&#xff0c;通过钓鱼邮件获取到主机权限&#xff0c;但是发现内网拦截了tcp的出网流量&#xff0c;聊一…...

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…...

Exoplayer(MediaX)实现音频变调和变速播放

在K歌或录音类应用中变调是个常见需求&#xff0c;比如需要播出萝莉音/大叔音等。变速播放在影视播放类应用中普遍存在&#xff0c;在传统播放器Mediaplayer中这两个功能都比较难以实现&#xff0c;特别在低版本SDK中&#xff0c;而Exoplayer作为google官方推出的Mediaplayer替…...

服务器间迁移conda环境

注意&#xff1a;可使用迁移miniconda文件 or 迁移yaml文件两种方式&#xff0c;推荐前者&#xff0c;基本无bug&#xff01; 一、迁移miniconda文件&#xff1a; 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝&#xff1a;scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…...

docker高级

文章目录 1.Docker Compose1.1 介绍1.2 compose文件1.3 常用命令1.4 安装1.5 项目说明和构建1.5.1 手工启动1.5.2 compose 编排启动1.5.3 完善 compose.yml1.5.4 加入前端容器 2.UI管理平台2.1 portainer 3.镜像发布3.1 阿里云3.2 Docker Registry3.2.1 介绍3.2.2 安装3.2.3 测…...

Redis Stream基本使用及应用场景

一、概念 Redis Streams是Redis5.0提供的一种消息队列机制&#xff0c;支持多播的可持久化的消息队列&#xff0c;用户实现发布订阅的功能&#xff0c;借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key&#xff1a;St…...

DAY40|动态规划Part08|LeetCode: 121. 买卖股票的最佳时机 、 122.买卖股票的最佳时机II 、 123.买卖股票的最佳时机III

目录 LeetCode:121. 买卖股票的最佳时机 暴力解法 贪心法 动态规划法 LeetCode:122.买卖股票的最佳时机II 基本思路 LeetCode: 买卖股票的最佳时机III、IV 基本思路 C代码 LeetCode:121. 买卖股票的最佳时机 力扣题目链接 文字讲解&#xff1a;121. 买卖股票的最佳时…...

【安装及调试旧版Chrome + 多版本环境测试全攻略】

&#x1f468;&#x1f4bb; 安装及调试旧版Chrome 多版本环境测试全攻略 &#x1f310; &#xff08;新手友好版 | 覆盖安装/运行/调试全流程&#xff09; &#x1f570;️ 【背景篇】为什么我们需要旧版浏览器测试&#xff1f; &#x1f30d; &#x1f310; 浏览器世界的“…...

【Linux】进程间通信——命名管道

文章目录 命名管道什么是命名管道**命名管道 vs. 无名管道**如何创建命名管道 用命名管道实现进程间通信MakefileComm.hppServer.hppClient.hppServer.cppClient.cpp 效果总结 命名管道 什么是命名管道 命名管道&#xff0c;也称为 FIFO&#xff08;First In First Out&#…...

Qt在Linux嵌入式开发过程中复杂界面滑动时卡顿掉帧问题分析及解决方案

Qt在Linux嵌入式设备开发过程中&#xff0c;由于配置较低&#xff0c;加上没有GPU&#xff0c;我们有时候会遇到有些组件比较多的复杂界面&#xff0c;在滑动时会出现掉帧或卡顿的问题。要讲明白这个问题还得从CPU和GPU的分工说起。 一、硬件层面核心问题根源剖析 CPU&#x…...

AI学习第六天-python的基础使用-趣味图形

在 Python 编程学习过程中&#xff0c;turtle库是一个非常有趣且实用的工具&#xff0c;它可以帮助我们轻松绘制各种图形。结合for循环、random模块以及自定义方法等知识点&#xff0c;能够创作出丰富多彩的图案。下面就来分享一下相关的学习笔记。 一、基础知识点回顾 &…...

[VMware]卸载VMware虚拟机和Linux系统ubuntu(自记录版)

记录一下,不是教程,只是防止我做错了可以回溯一下 我打开vscode,就会跳出下图 虚拟机,Linux还是很久之前学习安装的,种途可能卸载过(不太记得了),现在尝试彻底卸载 彻底卸载VMware虚拟机的详细步骤-CSDN博客虚拟机Vmware 转移 克隆 卸载及移除Linux系统_克隆的虚拟机怎么移除-…...

J-LangChain,用Java实现LangChain编排!轻松加载PDF、切分文档、向量化存储,再到智能问答

Java如何玩转大模型编排、RAG、Agent&#xff1f;&#xff1f;&#xff1f; 在自然语言处理&#xff08;NLP&#xff09;的浪潮中&#xff0c;LangChain作为一种强大的模型编排框架&#xff0c;已经在Python社区中广受欢迎。然而&#xff0c;对于Java开发者来说&#xff0c;能…...

Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)

漏洞简介&#xff1a; Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境&#xff1a; 春秋云镜中的漏洞靶标&#xff0c;CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…...

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站&#xff0c;想分享给大家。 在学习和工作的过程中&#xff0c;想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量&#xff0c;但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…...

STM32中使用PWM对舵机控制

目录 1、硬件JIE 2、PWM口配置 3、角度转换 4、main函数中应用 5、工程下载连接 1、硬件介绍 单片机&#xff1a;STM32F1 舵机&#xff1a;MG995 2、PWM口配置 20毫秒的PWM脉冲占空比&#xff0c;对舵机控制效果较好 计算的公式&#xff1a; PSC、ARR值的选取&#xf…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...