当前位置: 首页 > 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…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...