加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

面试现场【MySQL篇】

文章介绍MySQL主从架构的概念、优势及应用,详细阐述基于 binlog 的复制流程及主从一致性保障,比较主主、主从、主备的区别,分析导致主从延迟的硬件、事务、网络等因素并给出相应优化措施,最后列举双机主备、一主一从、一主多从、MariaDB 多主集群以及基于中间件的高可用方案,帮助读者构建可靠的数据库高可用环境。

Java面试必会知识点

抱歉,我无法直接访问该链接中的内容。请您把文章的正文粘贴在这里,我会根据提供的文本为您生成符合要求的摘要。

面试现场【JVM篇】

本文系统梳理了 JVM 面试常见的 20 题及详细答案,涵盖内存结构(程序计数器、虚拟机栈、本地栈、堆、方法区、直接内存)、垃圾回收原理(GC Roots、引用计数、根可达、分代收集、三色标记、标记‑清除/复制/整理算法、STW 与安全点、OopMap)以及常用 GC 类型(Serial、ParNew、Parallel Scavenge/Old、CMS、G1 等)和相关概念(四种引用、对象栈上分配、类加载、双亲委派、OOM 排查等),为面试提供完整的知识框架。

面试现场【综合篇】

本篇面试指南围绕系统设计与实现展开,涵盖项目亮点、零拷贝原理、五大IO模型及NIO与多路复用区别、Future阻塞获取结果机制、ReentrantLock 与 synchronized 的实现与差异、AQS、乐观/悲观锁、Paxos 协议、B+树特性、TCP 拥塞控制、JVM 实践、数据库分库分表及其缺点、分布式事务(TCC)方案、RocketMQ 消息可靠性保证,以及常见算法题。通过概念阐释与实现细节,帮助读者系统复习面试热点。

Synchronized详解

synchronized 用于对共享可变资源实现互斥访问,其本质是对象的 monitor 锁。JVM 将 synchronized 编译为 monitorenter/monitorexit 指令,进入对象的 Monitor 并在退出时释放。每个对象的 Mark Word 保存锁状态,锁可在无锁、偏向锁、轻量级锁和重量级锁之间单向升级;为降低竞争开销,JVM 进一步提供锁粗化、锁消除、偏向锁、轻量级锁、自旋等优化。通过这些机制,synchronized 在 JDK 1.5 以后已能与显式 Lock 的并发性能基本持平。

看一遍就理解:零拷贝详解

零拷贝是一种 I/O 优化技术,通过避免或最小化用户态与内核态之间的数据拷贝和上下文切换,提高传输效率。文章先说明传统 read/write 流程需要四次上下文切换和四次拷贝,随后回顾内核/用户空间、上下文切换、虚拟内存和 DMA 的基本概念。接着介绍三种实现方式: 1) **mmap+write**:利用虚拟内存将文件缓冲区映射到用户空间,减少一次 CPU 拷贝,仍有 4 次切换和 3 次拷贝; 2) **sendfile**:在内核中直接在文件描述符间传输数据,仅保留 2 次切换和 3 次拷贝(2 次 DMA、1 次 CPU); 3) **sendfile+DMA scatter/gather**:引入 SG‑DMA,全部使用 DMA 完成传输,实现真正的零拷贝,仅 2 次切换和 2 次 DMA 拷贝。 最后说明 Java NIO 对这两种方式的封装:`MappedByteBuffer` 对应 mmap,`FileChannel.transferTo/transferFrom` 对应 sendfile,Kafka 等高性能系统正是基于此实现高速传输。

聊聊幂等设计

幂等指一次和多次相同请求产生同等效果,关键在于请求的唯一标识。业务场景如转账、MQ 消费、表单重复提交等常因超时或重复而需幂等保障。实现思路是为每次请求生成全局唯一 ID(UUID、Snowflake 等),在处理前先检查记录,已存在则直接返回上次结果。常用的 8 种方案包括:① 先查询再插入并捕获唯一键冲突;② 直接插入利用冲突判断;③ 基于状态机的条件更新;④ 使用独立防重表;⑤ Token 令牌(Redis 保存并一次性删除);⑥ 悲观锁(SELECT … FOR UPDATE);⑦ 乐观锁(版本号校验);⑧ 分布式锁(Redis/ZooKeeper)。此外,HTTP 方法中 GET、HEAD、OPTIONS、DELETE、PUT 为幂等,POST 不具幂等性。通过上述设计,可在超时重试或并发环境下确保业务安全、避免重复操作。

面试现场【MQ篇】

本文梳理了十个常见的消息队列面试题及要点:阐述了 MQ 的概念和 RabbitMQ、RocketMQ、Kafka 等主流中间件;列举了应用解耦、流量削峰、异步处理、消息通信、远程调用等典型场景;重点说明了生产者、存储端和消费者三阶段如何防止消息丢失、实现同步刷盘和复制、确保消费成功;介绍了保证顺序消费的分区/单线程策略及局部有序实现方式;讨论了重复消费的可能性及基于唯一标识或 Redis 的幂等方案;提供了排查与扩容、分批消费等应对消息积压的思路;对 Kafka、RocketMQ、RabbitMQ 在吞吐、语言、持久化、顺序、集群等方面进行对比选型;解析了基于副本选举的高可用机制;说明了事务消息的两段提交流程以保证数据一致性;最后给出设计自研 MQ 时应考虑的整体流程、RPC、持久化、消费模型、高可用、事务与伸缩等关键要素。

Redis 缓存击穿、缓存穿透、缓存雪崩的解决方案

Redis 通过在内存中缓存 DB 数据,提高读写性能,但不当设计会出现三大问题: 1)缓存击穿:热点数据在高并发下刚好失效,所有请求冲击 DB。解决方案包括不设过期或加随机过期、预热热点、使用分布式锁防止并发 DB 读取。 2)缓存穿透:查询不存在的键,每次都落库。可在 DB 未命中时缓存空值,或使用布隆过滤器在查询前拦截不存在的键。 3)缓存雪崩:大量键同时间失效或 Redis 故障导致请求全部落库。防止措施有给过期时间加随机值、接口限流、服务熔断,以及构建 Redis 哨兵/Cluster 高可用集群。 通过上述策略,可保障缓存的高可用性,避免对后端数据库造成冲击。

面试现场【List篇】

List是Java集合接口,常用实现ArrayList(数组,查询快,容量不足时按1.5倍扩容)和LinkedList(链表,增删快)。ArrayList适合读多写少,LinkedList适合写多读少。List可重复有序,Set不重复无序且基于Map。Vector已少用,线程安全List可用Collections.synchronizedList或CopyOnWriteArrayList;后者写时复制实现并发读,但占内存多且读到旧数据。排序用list.sort或Collections.sort,遍历删除用Iterator.remove或list.removeIf避免fast‑fail。

Redis分布式锁的七种方案

Redis 分布式锁需具备互斥、超时、可重入、高性能和安全等特性。文章系统阐述七种实现方案:①SETNX+EXPIRE(非原子)②SETNX+时间戳(依赖时间同步)③Lua 脚本保证原子性④SET EX PX NX(仍有误删风险)⑤在值中加入唯一标识并用 Lua 校验后删除⑥Redisson 框架通过看门狗自动续期⑦Redlock 多主节点算法确保跨集群可靠性,并由 Redisson 实现。每种方案的优缺点及适用场景均有说明。

面试现场【多线程篇】

文章围绕多线程面试展开,首先说明多线程提升资源利用率、并发能力及常见应用场景,如高并发 I/O、耗时任务和定时任务。随后阐述线程安全的定义,并给出处理手段:原子类、CountDownLatch、Semaphore、java.util.concurrent 集合、synchronized、Lock 及分布式锁。接着解析 synchronized 的底层 monitorenter/monitorexit 实现及 ACC_SYNCHRONIZED 标志,并比较其与 ReentrantLock 的区别,强调后者支持手动释放、可公平/非公平、可中断、超时及 tryLock。最后介绍公平锁概念及 CAS(比较并交换)在乐观锁和原子类中的作用。