【秋招跳槽攻略】把BATJ大厂必问的JVM知识点吃透,大厂offer轻松到手!

LangGraph 持久化:程序退出后接着跑,用 SQLite 跨进程恢复任务 用 SQLite 保存 LangGraph 待审批任务,先退出 Python 进程,再用相同 thread_id 恢复。附完整脚本、实测结果与拒绝、错任务号、内存后端、重复恢复四个反例。 阅读详情

前言

JVM的重要性

很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试。无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎。不管是工作还是面试中,JVM都是必考题。如果不懂JVM的话,薪酬会非常吃亏。其实学习JVM并不仅仅可以用于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。

JVM的优势

想要告别增删改查和简单开发,而是去做Java性能分析和调优工作,那么JVM绝对是一把助力的利剑。对于Java开发者而言,只有熟悉底层虚拟机的运行机制,才能通过JVM日志深入到字节码的层次去分析排查问题,发现隐性的系统缺陷,进而提升系统性能。

学习JVM的原因,本质是让你了解Java程序是如何被执行且优化的。这样一来,你才可以从内部入手,达到高效编程的目的。同时,你也可以为学习更深层、更核心的Java技术打好基础,且对于面试JVM时阿里是100%必问常问的高频点之一。

先上一波面试高频题,测试一下自己水平(在先不看答案的情况下),答不上就跟我老老实实的一起学习呗~

高分JVM_1_面试高频点77个,测试一下?

  • 1、java中会存在内存泄漏吗,请简单描述。
  • 2、64 位 JVM 中,int 的长度是多数?
  • 3、Serial 与 Parallel GC 之间的不同之处?
  • 4、32 位和 64 位的 JVM,int 类型变量的长度是多数?
  • 5、Java 中 WeakReference 与 SoftReference 的区别?
  • 6、JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?
  • 7、怎样通过 Java 程序来判断 JVM 是 32 位 还是 64位?
  • 8、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
  • 9、JRE、JDK、JVM 及 JIT 之间有什么不同?
  • 10、解释 Java 堆空间及 GC?
  • 11、JVM 内存区域
  • 12、程序计数器(线程私有)
  • 13、虚拟机栈(线程私有)
  • 14、本地方法区(线程私有)
  • 15、你能保证 GC 执行吗?
  • 16、怎么获取 Java 程序使用的内存?堆使用的百分比?
  • 17、Java 中堆和栈有什么区别?
  • 18、描述一下 JVM 加载 class 文件的原理机制
  • 19、GC 是什么?为什么要有 GC?
  • 20、堆(Heap-线程共享) -运行时数据区
  • 21、方法区/永久代(线程共享)
  • 22、JVM 运行时内存
  • 23、新生代
  • 24、老年代
  • 25、永久代
  • 26、JAVA8 与元数据
  • 27、引用计数法
  • 28、可达性分析
  • 29、标记清除算法( Mark-Sweep)
  • 30、复制算法(copying)
  • 31、标记整理算法(Mark-Compact)
  • 32、分代收集算法
  • 33、新生代与复制算法
  • 34、老年代与标记复制算法
  • 35、JAVA 强引用
  • 36、JAVA软引用
  • 37、JAVA弱引用
  • 38、JAVA虚引用
  • 39、分代收集算法
  • 40、在新生代-复制算法
  • 41、在老年代-标记整理算法
  • 42、分区收集算法
  • 43、GC 垃圾收集器
  • 44、Serial 垃圾收集器(单线程、 复制算法)
  • 45、ParNew 垃圾收集器(Serial+多线程)
  • 46、Parallel Scavenge 收集器(多线程复制算法、高效)
  • 47、Serial Old 收集器(单线程标记整理算法 )
  • 48、Parallel Old 收集器(多线程标记整理算法)
  • 59、CMS 收集器(多线程标记清除算法)
  • 50、G1 收集器
  • 51、JVM 类加载机制
  • 52、类加载器
  • 53、双亲委派
  • 54、OSGI( 动态模型系统)
  • 55、动态改变构造
  • 56、模块化编程与热插拔
  • 57、JVM内存模型
  • 58、栈
  • 59、本地方法栈
  • 60、程序计数器
  • 61、堆
  • 62、方法区
  • 63、分代回收
  • 64、堆和栈的区别
  • 65、什么时候会触发FullGC
  • 66、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
  • 67、对象分配规则
  • 68、描述一下JVM加载class文件的原理机制?
  • 69、Java对象创建过程
  • 70、简述Java的对象结构
  • 71、如何判断对象可以被回收
  • 72、JVM的永久代中会发生垃圾回收么
  • 73、垃圾收集算法
  • 74、调优命令有哪些?
  • 75、调优工具
  • 76、Minor GC与Full GC分别在什么时候发生?
  • 77、你知道哪些JVM性能调优?

答案有点多(源自[Java25大面试专题-JVM])

高分JVM_2_内存结构(程序计数器+虚拟机栈+本地方法栈+堆+方法区)

1. 程序计数器

  • 1.1 定义
  • 1.2 作用

2. 虚拟机栈

  • 2.1 定义
  • 2.2 栈内存溢出
  • 2.3 线程运行诊断

3. 本地方法栈

4. 堆

  • 4.1 定义
  • 4.2 堆内存溢出
  • 4.3 堆内存诊断

5. 方法区

  • 5.1 定义
  • 5.2 组成
  • 5.3 方法区内存溢出
  • 5.4 运行时常量池
  • 5.5 StringTable
  • 5.5 StringTable 特性
  • 5.6 StringTable 位置
  • 5.7 StringTable 垃圾回收
  • 5.8 StringTable 性能调优

6. 直接内存

  • 6.1 定义
  • 6.2 分配和回收原理

高分JVM_3_垃圾回收

1. 如何判断对象可以回收

  • 1.1 引用计数法
  • 1.2 可达性分析算法
  • 1.3 四种引用

2. 垃圾回收算法

  • 2.1 标记清除
  • 2.2 标记整理
  • 2.3 复制

3. 分代垃圾回收

  • 3.1 相关 VM 参数

4. 垃圾回收器

  • 4.1 串行
  • 4.2 吞吐量优先
  • 4.3 响应时间优先
  • 4.4 G1

5. 垃圾回收调优

  • 5.1 调优领域
  • 5.2 确定目标
  • 5.3 最快的 GC
  • 5.4 新生代调优
  • 5.5 老年代调优
  • 5.6 案例

高分JVM_4_类加载与字节码技术

高分JVM_5_内存模型

详情内容(部分)

高分JVM_6_调优(敲重点,源自:Java性能调优实战-JVM性能监测及调优)

看一张JVM调优的手绘学习路线图(可提供原件下载)

Java性能调优实战-JVM性能监测及调优,详情目录如下,可以看见有哪几部分的内容...


“走后门”成功!万分感激腾讯大佬的手敲“高分JVM”秘籍

  • 磨刀不误砍柴工:欲知JVM调优先了解JVM内存模型
  • 深入JVM即时编译器JIT,优化Java编译
  • 如何优化垃圾回收机制?
  • 如何优化JVM内存分配?
  • 内存持续上升,我该如何排查问题?

内容详情(部分)

高分JVM_7_入门到入魔

内容解释(部分)

再BB几句

以上说了这么多,都是JVM必备必学的东西,7份高分JVM:面试+内存结构+垃圾回收+类加载与字节码技术+内存模型+JVM从入门到入魔全是我逆袭的秘籍!

BB这么多,我还想问一句,JVM到底该学习什么?其实说起来也就三点吧...

  • 源码到类文件
  • 类文件到JVM
  • JVM各种折腾[内部结构、执行方式、垃圾回收、本地调用等]
  • 看我手绘的深入Java虚拟机的学习路线,对比大纲,可以迅速回忆全部的知识

JVM 调优面试通关指南:堆分代、TLAB、G1 vs ZGC、四种引用、GC 日志分析 + 电商秒杀/工单导出/缓存膨胀六大业务场景【高频题精讲】 本文系统解析JVM内存模型与GC高频面试题,涵盖运行时数据区、堆分代机制、四种引用类型及G1/ZGC等主流收集器原理。结合优惠券秒杀、大报表导出等六大真实业务场景,详解高并发下对象分配优化、OOM排查流程(jstat/jmap/GC日志)与调优策略,附速记卡与参数模板,助力开发者从“背题”到“实战”跃迁。 阅读详情

相关推荐

安装了anaconda,pycharm导入numpy时提示没有该包(模块)?

**问题详情:**我安装了anaconda,在利用Pycharm学习numpy这个库的时候,导入numpy这个包的时候提示我没有nummpy这个模块:No module named numpy.如下图所示。 应该说安装了Anaconda,里边就自带了numpy这个库,就应该能够使用。我一个新手怎么搞得懂呢?于是网上查了查找到了一个解决办法,说是我项目的解释器应该设置为Anaconda安装目录下的python.exe,而不应该是系统自带的:https://blog.youkuaiyun.com/aanndd77/art

qq_39820505的博客 1万+

内存数据库SQLite

本文以“黑板”比喻内存数据库,对比传统硬盘数据库,详解 SQLite 使用 :memory: 实现高速临时存储的原理与优势。通过动态占位符生成、executemany 批量操作等技巧,实现毫秒级数据读写,适用于单元测试、临时计算与隐私保护场景。强调其瞬时性与内存限制,提醒开发者注意数据量控制与安全防护,突出参数化查询防注入的核心价值。

看了都说刑的博客 326

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了遇到‘Floating point exception’错误时的7个详细排查步骤。从理解浮点异常的本质到边界条件检查、时间步长设置、求解器选择、网格优化、亚松弛因子调节以及高阶格式的取舍,帮助用户快速定位并解决问题,确保CFD仿真的稳定性和准确性。

weixin_30480075的博客 260

深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析

本文深入解析JVM垃圾回收机制,涵盖GC核心概念、垃圾判定(基于可达性分析)、四大回收算法(标记清除、复制、标记整理、分代回收)及其应用场景。重点说明GC主要作用于堆内存,通过根对象遍历识别不可达对象,避免循环引用问题;并结合新生代与老年代特性,阐述分代回收如何提升效率,实现高效内存管理。

qq_61228769的博客 660

光栅衍射有入射角时_衍射型多焦点人工晶体光学原理

多焦点人工晶体如何把光线分成多个焦点的?这个问题大部分专业书只是蜻蜓点水,并没有讲明白。希此文粗浅的解释,能帮您加深理解,请多指正。接下来,我将按照一下历史发展的顺序讲解一下:光的认识、菲涅尔灯塔(菲涅尔透镜)、菲涅尔波带盘(半波带盘)、多焦点人工晶体。一:首先复习一下光的认识历史。我们现在都知道光是一种电磁波,具有波粒二相性,但是认识光的本质也经历非常曲折漫长的过程。牛顿时代的几何光...

weixin_28963467的博客 2352

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250

11-01-演进-.NET GC发展史

.NET GC发展史映射硬件演进:从单核STW到多核并发,再到区域化细粒度回收。历经分代管理、ServerGC、BackgroundGC、LOH自动压缩、POH隔离、DATC自适应线程数及Region-based管理等关键革新,代码量从5000行增至4万+,复杂度指数上升。每一步优化均在暂停时间、吞吐量与资源开销间权衡,体现“实用主义”哲学。核心启示:GC演进由硬件驱动,方向明确——更短暂停、更高效率,但代价是工程复杂性持续攀升。

设计 AI 玩游戏🎮 373

YOLOv8自定义训练:车牌识别全流程(从标注到推理,附可视化代码)

车牌检测全流程实践指南 摘要:本文详细介绍了基于YOLOv8的车牌检测完整实现方案。针对车牌检测中的三大难点(小目标、多角度、光照变化),提供了从数据准备到模型部署的全流程解决方案。重点包括:1)数据采集与标注规范;2)针对小目标的YOLOv8模型优化配置;3)K-means锚框聚类方法;4)训练参数调优策略。通过实际验证,该方法可获得95%以上的检测准确率,并附有完整的代码实现和可视化工具,便于开发者快速复现应用。 (字数:149字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 850

JVM中的GC垃圾回收器

同时,引入ZGC:可伸缩的低延迟垃圾回收器(Experimental)。删除CMS垃圾回收器,并弃用Parallel Scavenge和Serial Old的组合。1999年随JDK1.3.1一起来的是串行方式的Serial GC,它是第一款GC。有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品称为Garbage Collector。2018年3月,JDK 10中G1垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。2020年9月,JDK15发布。

记录一点 400

YOLOv8 骨骼结构识别详细说明

YOLOv8骨骼结构识别是一种基于深度学习技术的医学影像分析方法,主要用于X光、CT等影像中的骨骼定位与识别。该系统具有多骨骼同步识别能力,可应用于手部、脊柱、骨盆等不同部位,并能精确定位骨骼关键点。技术实现包括数据预处理、模型训练、推理检测、关键点分析和批量处理五个核心模块,支持骨折检测、骨龄评估等临床应用。该系统需注意医学合规性,要求高质量标注数据,并针对骨骼影像特点进行特征工程优化,同时考虑不同设备的部署需求。

u010117029的博客 330

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 896

智学文枢:题目管理页

题目管理页是「智学文枢」的数据基座入口,用一个 10 列的 QTableWidget 承载学生级习题的筛选、搜索、CRUD 与自动流水线触发,其核心难点不是"画表格",而是把"前端过滤 + Store 信号刷新 + 组合题父子展示 + 懒加载规避"组织成一条不卡 UI 的渲染管线。

caixuwen的专栏 290

IO Virtualization with Virtio.part 2 [十三]

通过对virtio_device_id 中的 device 和 vendor 的值进行比较,我们找到对应的 virtio 驱动,由于这里我们使用 i2c virtio 为例,所以调用 virtio_i2c_probe 进行 virtio i2c 设备的初始化。在和 virtio mmio 设备交互时我们会读取 VIRTIO_MMIO_DEVICE_ID 和 VIRTIO_MMIO_VENDOR_ID,并将其值写入 virtio_device_id 中,这个就会用作后面和 virtio 设备驱动的匹配参数。

cxjczy1990的博客 1211

在.NET WinForms中创建SQLite数据库

本文介绍在WinForms项目中使用SQLite的完整流程:通过NuGet安装System.Data.SQLite.Core包,将数据库文件置于程序目录下,利用CREATE TABLE IF NOT EXISTS实现自动建库建表;通过封装GetConnection()方法管理连接,初始化时调用Init()创建表结构;后续通过参数化SQL实现增删改查操作,支持数据绑定、登录验证等场景,确保安全高效。

2301_80809484的博客 295

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

DeepSeek总结的 SQLite 某些 double 值的最后一位与 Python 不同

2 不能整除 10,所以转换是混乱的。然而,在这种情况下,由于它是完美的 2 的幂,那个舍入残留实际上是正确的。但你必须理解,超过第 15 位小数,对于这些特定数字来说,更多的是副作用,而不是预期行为。归根结底,你在这里看到的差异最直接地可以称为 SQLite 的“错”,因为它不同,但它以一种聪明的方式不同——至少是一种主要面向人类而非计算机的聪明方式。而且,如果作为开发者的你试图使用已转换为十进制字符串的数字进行数学运算,那是更大的错。据你所知,它们存储的是完全相同的值,只是打印例程输出它们的方式不同。

l1t的专栏 439

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Mandate持久化实测:nonce落盘之后,进程重启再也撕不开重放窗口

Mandate授权系列第⑦篇,直接修上一篇发现的最大残留风险。上一篇实测:nonce缓存只在内存,进程重启后窗口期内逐字节重放成功。本篇把nonce、Mandate、revoke三类安全状态落盘SQLite,重跑攻击:重启后重放被拒(R1)、Mandate重载验签有效且越界仍拦(R2)、revoke重启后仍生效(R3),内存版对照重启后重放照样成功(R4)。安全状态的生命周期必须覆盖进程的生命周期。

weixin_39885962的博客 491

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ERP单据已作废为什么商品仍不能删除,引用检查与软删除怎么查

ERP销售单作废后,商品引用仍可能保留。本文用真实Store和内存SQLite对照无引用、草稿引用及作废引用,核对删除确认、deleted标记和列表过滤范围。

qq_52097248的博客 331

深入理解 JVM 内存划分:程序计数器、元数据区、栈区、堆区全解析

维度程序计数器栈区堆区元数据区线程私有/共享私有私有共享共享存储内容下一条字节码地址栈帧(局部变量表、操作数栈等)对象实例、数组类元信息、运行时常量池生命周期随线程随方法调用(栈帧入栈出栈)随对象(GC 决定)随类(类卸载才回收)是否 GC不涉及不涉及(栈帧自动弹出)是(主战场)条件苛刻的类卸载异常无OOMOOM。

qq_61228769的博客 731

JVM 学习笔记:内存区域、类加载机制与垃圾回收

JVM 的学习可以沿着“内存怎么划分、类怎么加载、垃圾怎么回收”这条主线展开,先建立整体结构,再逐步深入每个细节。

2403_89180207的博客 200

JavaEE(7)JVM

本文系统介绍JVM核心机制:基于HotSpot(JDK8)阐述其执行流程、运行时数据区(堆、方法区、栈等)、类加载双亲委派模型及破坏场景;重点解析垃圾回收原理,包括可达性分析、四种引用、三大算法与分代收集思想,并对比常见收集器特性,涵盖Minor/Full GC差异与并发并行策略,为性能调优与内存问题排查提供理论基础。

2502_93175209的博客 335

ThreadLocal 搭配线程池为什么会造成内存泄漏?

清理,属于“被动清理”,并不能保证及时回收。这类问题在用户身份、租户 ID、事务上下文、链路追踪 ID 等场景中后果非常严重,排查起来也远比 OOM 困难。,对应的 value 就会一直无法被回收,最终表现为内存泄漏,甚至引发脏数据串号问题。所以线程池不是“制造”了泄漏,而是把原本短暂的持有时间拉长成了“与线程同寿命”。线程池中的核心线程会被长期复用、几乎不会销毁,于是挂在。在“一个请求一个线程”的传统模型里,线程执行完任务就结束,,同时警惕线程复用带来的数据串号风险。只要线程活着,这条链就断不了。

2603_95090839的博客 155

Java多线程(7):异步编程详解——Future、CompletableFuture与任务编排

前面的文章已经介绍过线程池、JUC 同步工具、CAS 与原子类,以及锁机制。一个请求需要调用多个服务,部分调用可以并行执行,部分调用又依赖前一个调用的结果,如何组织这些异步任务?以订单详情为例,需要查询用户、价格、库存和推荐内容。其中用户、价格、库存互不依赖;推荐内容则依赖用户信息。线程池解决了任务由谁执行,Future提供了异步结果的获取方式;本篇进一步学习如何在任务完成后自动处理结果、表达任务依赖和汇总多个结果。前文已经介绍过FutureTask,这里不重复线程池参数及其内部实现。本文以JDK 8。

作为一个长者,有必要记录下人生经验 322

ChatGPT、Codex内存排查:JVM堆内存还没到Xmx,Spring Boot容器为什么先被OOMKilled?

JVM堆内存还没达到Xmx,Spring Boot容器为什么先被OOMKilled?本文从Kubernetes生产故障切入,分析DirectByteBuffer、Metaspace、线程栈和Native Memory等堆外内存来源,并介绍通过容器监控、JVM诊断和Codex辅助排查的方法。

2601_96380027的博客 395

JVM 入门详解:从内存结构、对象创建到垃圾回收与内存泄漏

从一行 new 出发,结合代码与一二布布讲解图,理解 JVM 的堆、栈、方法区、对象引用、可达性分析与分代回收,并区分内存泄漏、分配压力和资源泄漏,说明永久代与元空间的版本差异。

qq_42913081的博客 277

JVM 换上 LLVM:目前赢在广度,输在速度

第一,Jeandle 的看点现在是"桥",暂时还不是"快"。值得盯的是 statepoint、safepoint、类型、Java 语义这四座桥是不是真通了。桥通了,剩下的优化是堆人力往上加的事;桥不通,加多少都会在 deopt 和并发 GC 上翻车。第二,JVM 编译器的门槛被它拉低了一档。以前要碰 JVM JIT,得先把 C2 那套自研 IR 和寄存器分配啃下来;现在可以在 LLVM IR 这一层理解、实验、改。

u014493323的博客 157

排掉一类,另一类也不见了

文章实测 SQL 三值逻辑如何让排除查询意外丢行:<> 会过滤空值,NOT IN 子查询含 NULL 可能返回空集,LEFT JOIN 的右表条件放进 WHERE 也可能使外连接退化。文中还厘清 COUNT、SUM、AVG 的空值行为及 SQL 与 pandas 分组差异,并给出显式保留空值和对账校验的方法

patrickstar231的博客 851
上一篇: 金九银十!从行业外包再到斩获阿里offer,这份PDF功不可没!
下一篇: Java岗:看完这20W字Java后端性能实战经验手册,不再害怕跟面试官谈及“后端优化”问题!
在酒吧写代码
博客等级 码龄7年 210粉丝 330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值