资讯动态

《Java面试85题图解版(二)》进阶深化上篇:并发编程 + JVM

发布时间:2026/8/21 13:56:46 来源:尧图企业网站定制
《Java面试85题图解版二》进阶深化上篇并发编程 JVMJava面试85题图解版 · 全系列7篇基础核心篇 | 并发JVM← 你在看 | Spring数据库 | Redis缓存 | 高阶架构 | 高阶特性即将发布 全系列总目录 | 每道题 结构图 → 场景比喻 → 对比表 → 一句话总结阅读提示这是“图解比喻一句话总结”面试题库第二篇的进阶深化上篇覆盖并发编程7题与JVM7题共14道面试高频题。每道题仍然是四层结构——结构图 → 场景比喻 → 关键对比表 → 一句话总结。一、并发编程第30-36题 第30题四种创建线程的方式一图看清1. 继承Thread → 重写run() 2. 实现Runnable → 实现run() 3. 实现Callable → 实现call()可返回结果抛异常 4. 线程池推荐 → 复用线程控制资源 JDK21新增虚拟线程 → 百万级并发无需池化比喻记忆请人干活继承Thread指定某人是干活的料直接让他干。Runnable写一张任务单给谁都能执行。Callable任务单回执干完还给你结果。线程池雇几个专职人员来活了分配干完回来待命。虚拟线程临时工零成本需要时直接雇用完就走。 一句话总结简单用Runnable需返回值用Callable生产必须线程池JDK21可上虚拟线程。 第31题synchronized 锁升级过程一图看清无锁 ─→ 偏向锁 ─→ 轻量级锁自旋CAS ─→ 重量级锁OS Mutex 同一线程多次进 少量线程交替执行 激烈竞争挂起唤醒比喻记忆会议室使用规则无锁会议室空着谁都能用。偏向锁小王经常用门上贴“小王专用”直接进。轻量级锁变成先到先得小李偶尔来门口徘徊等自旋抢到就进。重量级锁人太多了保安介入——“都别在门口转了下来排队叫号再进”。挂起唤醒慢。 一句话总结无锁→偏向→轻量级→重量级竞争越激烈锁越重只升不降。 第32题volatile 的可见性与有序性一图看清可见性 ✅写后立即刷新主存读前强制从主存取 有序性 ✅禁止指令重排序内存屏障 原子性 ❌i 复合操作仍不安全比喻记忆大堂公告屏 vs 部门小黑板普通变量各部门自己的小黑板。老板在财务部写了“销售额1亿”销售部看不见。volatile大堂LED公告屏老板一写所有人都看见。但不能做“把总数1”这种需要读改写三步的操作三步中间别人也可能动。 一句话总结volatile一写全公司可见顺序不乱但复合操作仍需加锁。 第33题synchronized vs ReentrantLock一图看清synchronizedJVM内置自动加解锁非公平单条件队列 ReentrantLockAPI级手动加解锁(try/finally)可公平多Condition可尝试加锁(tryLock)比喻记忆电子门禁 vs 机械钥匙synchronized进门自动锁门出门自动解锁。简单但功能少。ReentrantLock手动钥匙可以公平排队可以有多个等待区Condition可以试试“现在能不能开”tryLock。 一句话总结简单场景synchronized够用需要Condition/可中断/尝试加锁时用ReentrantLock。 第34题线程池核心参数与工作流程一图看清新任务 → ├─ 核心线程未满 → 创建核心线程 ├─ 核心线程满 → 入队列排队 │ ├─ 队列未满 → 等待执行 │ └─ 队列满 → 线程数最大→ 创建非核心线程 │ └─ 已达最大 → 拒绝策略 └─ 空闲超时(keepAliveTime) → 非核心线程销毁 不推荐Executors无界队列可能OOM最大线程数可能Integer.MAX_VALUE比喻记忆银行柜台corePoolSize5个常驻柜台客户来了直接办。workQueue10个等候座位坐满了经理才着急。maximumPoolSize临时开3个流动柜台总共最多8个。拒绝策略大厅站不下了保安拦人“明天再来”。keepAliveTime高峰期过后空闲临时柜台5分钟撤掉。 一句话总结5常驻柜→10座等候→8临时极限→满了就拒闲了撤临柜绝不用Executors偷懒。 第35题ThreadLocal 原理与内存泄漏一图看清Thread → ThreadLocalMap → Entry(key弱引用ThreadLocal → value强引用) 当外部强引用ThreadLocal置null → key被GC → Entry的value仍强引用 → 泄漏 线程池中线程长期复用 → ThreadLocalMap一直存在 → value无法回收比喻记忆公司衣柜Thread 员工ThreadLocalMap 员工专属衣柜。key弱引用 抽屉标签撕掉后没人知道里面装啥。value强引用 抽屉里的羽绒服只要员工线程不走羽绒服就占着柜子。线程池员工是长期工衣柜越塞越满必须每次用完清空——remove()。 一句话总结ThreadLocal的弱引用key被GC后value赖着不走线程池必须手动remove。 第36题CompletableFuture 异步任务编排一图看清supplyAsync → 启动异步任务返回结果 thenApply → 转换结果 thenAccept → 消费结果无返回 thenCombine → 合并两个独立任务的结果 thenCompose → 依赖上一步结果启动新任务扁平化 allOf / anyOf → 等所有完成 / 任一完成 exceptionally / handle → 异常兜底比喻记忆餐厅取餐牌supplyAsync下单“宫保鸡丁”拿到取餐牌。thenApply菜好了自动加一份米饭转换结果。thenCombine鸡丁和鱼香肉丝同时做好了放同一个托盘。thenCompose先看今日特价菜单再决定点哪个依赖第一步结果。allOf宴请所有菜齐了才开吃。exceptionally哪道菜做砸了赔个水果盘。 一句话总结CompletableFuture像取餐牌能串行、并行、合并、兜底告别Future.get()阻塞。二、JVM第37-43题 第37题JVM 运行时数据区一图看清线程共享 堆对象实例、数组 方法区/元空间类元信息、运行时常量池 线程私有 程序计数器 虚拟机栈栈帧局部变量表、操作数栈 本地方法栈比喻记忆公司办公大楼堆公共办公区所有员工共用。保洁阿姨GC清理没人用的工位。方法区/元空间公司档案室保存组织架构、规章制度。JDK8后档案室搬到地下室本地内存不占主楼面积。虚拟机栈员工个人工作记录本任务完成翻回上页方法返回。程序计数器手指指着当前正在执行哪一行代码。 一句话总结堆和方法区大家共享栈、PC寄存器、本地栈各线程独有。 第38题Java 堆的分代模型一图看清新生代Eden S0 S1默认8:1:1 ↓ Minor GC存活后年龄1 → 进入Survivor区 ↓ 年龄达到阈值默认15→ 晋升老年代 老年代 ↓ 大对象可直接进入 JDK8永久代→元空间本地内存 JDK9G1默认收集器逻辑分代 JDK21分代ZGC比喻记忆公司员工分级新生代Eden试用期员工大部分待不久就被优化。S0/S1转正考核区每熬过一次考核年龄1。老年代老员工熬过15次考核或大对象直接空降高管。元空间公司规章制度不占工位。 一句话总结新生代复制回收熬过去进老年代元空间存类信息不占堆。 第39题垃圾回收算法一图看清标记-清除标记存活 → 清除未标记 → 产生内存碎片 复制算法内存分两块 → 存活复制到另一块 → 清空当前块 → 浪费一半内存 标记-整理标记存活 → 向一端移动 → 清边界外 → 无碎片但STW时间长 分代收集新生代用复制老年代用标记-清除/整理比喻记忆三种搬家方式标记-清除贴“要/不要”标签不要的扔出窗外。房间空了但家具乱七八糟大沙发放不下内存碎片。复制算法你有A、B两间房把A里还要的搬到B一把火烧掉A。整齐但永远只用一半房间。标记-整理把还要的推到房间一端尾部全清空。最整齐但搬家最累移动对象开销大。 一句话总结新生代复制快老年代整理无碎片分代组合是主流。 第40-41题常见垃圾回收器及CMS vs G1一图看清Serial / Serial Old → 单线程小内存Client模式 ParNew CMS → 低延迟并发标记清除碎片浮动垃圾JDK8常用 Parallel Scavenge Parallel Old → 关注吞吐量后台计算 G1 → Region分区可预测停顿JDK9默认 ZGC / Shenandoah → 超低延迟1msJDK21分代ZGC比喻记忆清洁工团队Serial一个人干全部小房间够用。CMS几个人边干活边让人用房间低延迟但房间不整齐碎片偶尔要大扫除退化为Serial Old全STW。G1把大楼划分成多个区域哪块最脏先清哪块在规定时间内完成。JDK9后默认清洁团队。ZGC几乎看不见的清洁工你感觉不到他们在工作。 一句话总结低延迟CMS老→G1JDK9默认→ZGCJDK21分代极低延迟。 第42题类加载过程与双亲委派模型一图看清类加载过程加载 → 验证 → 准备 → 解析 → 初始化 读取 格式 分配 符号 static 字节码 检查 赋零值 引用→ 赋值 直接引用 双亲委派请求向上委派子→父→爷加载向下查找爷→父→子 Bootstrap ClassLoader → Extension ClassLoader → Application ClassLoader → 自定义比喻记忆新员工入职 小孩要零花钱加载HR拿到简历录入系统。验证背调检查学历证真伪、有无犯罪记录。准备分配工位、电脑但桌上还是空的static变量赋零值。解析把“隔壁部门张三”这种称呼转成工号符号引用→直接引用。初始化新员工到岗摆个人物品装软件执行static赋值和static代码块。双亲委派小孩要零花钱先问爸爸问爷。爷有就给都没有爸爸才自己掏。防止小孩用假钞自定义String冒充真钱。 一句话总结加载五步走双亲委派向上请求向下加载护住核心库不被篡改。 第43题OOM 排查与定位一图看清常见OOM类型 Java heap space → 堆溢出对象太多 Metaspace → 元空间不够类加载过多 unable to create new native thread → 线程数超系统限制 排查工具链 jstat → 监控GC和内存 jmap -dump → 导出堆快照 jstack → 看线程状态 MAT / JProfiler → 分析dump文件 GC日志 → -XX:PrintGCDetails比喻记忆查漏水jstat 监控水管压力表发现水位在涨。jmap dump拆开天花板看哪段管子出问题。MAT分析工程师分析是哪个厂家的管道老化了。解决换管修代码、调水压调JVM参数、加装蓄水池扩容内存。 一句话总结监控堆dumpMAT定位根源修代码或调参ThreadLocal和集合未清理是最常见泄漏点。本篇上篇我们覆盖了并发编程从锁升级到CompletableFuture、JVM从运行时数据区到OOM排查的全部核心知识。这些正是面试官在中后段最爱追问的深水区。上一篇基础核心篇下一篇进阶深化中Spring核心 数据库进阶 —— Spring循环依赖三级缓存情侣杯比喻、自动装配、Transactional失效坑、MySQL三日志、索引失效八大场景、PG高级索引…… 点击关注我 返回全系列导航

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价