2025年Java最新社招面试八股文+技术场景题(金九银十)
一、Java基础与JVM篇
1. Java核心八股文
HashMap vs. ConcurrentHashMap
HashMap:非线程安全,JDK1.8后采用数组+链表/红黑树,扩容可能死循环(JDK1.7)。
ConcurrentHashMap:线程安全,JDK1.8改用CAS + synchronized优化锁粒度。
synchronized vs. ReentrantLock
synchronized:JVM内置锁,自动释放,非公平锁。
ReentrantLock:可重入锁,支持公平锁/非公平锁,可中断,支持Condition条件队列。
volatile的作用?能否保证原子性?
保证可见性(强制主存读取最新值)和有序性(禁止指令重排序),但不保证原子性(如
i++
仍需AtomicInteger
)。
ThreadLocal原理及内存泄漏问题
每个线程维护
ThreadLocalMap
,Key是弱引用,Value是强引用,需手动remove()
避免内存泄漏。
Java 8新特性
Lambda表达式、Stream API、Optional、方法引用、接口默认方法。
2. JVM深度解析
JVM内存模型
线程私有:虚拟机栈、本地方法栈、程序计数器。
线程共享:堆、方法区(JDK1.8后为元空间)。
G1垃圾回收器特点
分Region回收,可预测停顿,适合大内存应用。
OOM排查方法
使用MAT分析堆转储文件,
jstack
查线程死锁,jmap
获取堆内存快照。
类加载机制与双亲委派模型
加载→验证→准备→解析→初始化。
打破双亲委派:重写
loadClass()
(如Tomcat的WebAppClassLoader)。
二、并发编程与分布式系统
1. 并发编程核心
线程池参数设置
corePoolSize
(核心线程数)、maxPoolSize
(最大线程数)、workQueue
(任务队列)、拒绝策略。IO密集型:
CPU核心数 * 2
;CPU密集型:CPU核心数 + 1
。
AQS(AbstractQueuedSynchronizer)原理
核心:
state
(资源状态)+CLH队列
(线程排队),实现类如ReentrantLock
、CountDownLatch
。
CAS的ABA问题如何解决?
使用
AtomicStampedReference
(版本号)或AtomicMarkableReference
(时间戳)。
分布式锁实现方式
Redis(SETNX + RedLock)、ZooKeeper(临时节点 + Watch机制)。
2. 分布式系统设计
CAP理论应用
银行系统侧重CP(一致性+分区容错性),支付系统必须保证数据强一致。
分布式事务解决方案
2PC(强一致但性能差)、TCC(最终一致)、SAGA(长事务)、本地消息表。
分布式ID生成
Snowflake(趋势递增,时钟回拨问题)、Leaf-Segment(DB号段缓冲,适合金融场景)。
三、数据库与缓存优化
1. MySQL深度优化
十亿级数据分页查询优化
ES
search_after
(深度分页)、覆盖索引+禁止跳页(LIMIT
优化)。
索引失效场景
LIKE '%xx'
、函数计算、OR条件、隐式类型转换。
MVCC实现原理
ReadView
+Undo Log
版本链,解决不可重复读 & 幻读。
2. Redis高级应用
缓存一致性方案
延迟双删(先删缓存→更新DB→再删缓存)、订阅Binlog(Canal监听MySQL变更)。
热点数据隔离
为秒杀商品配置独立Redis集群,避免影响主业务。
Redis持久化策略
RDB(快照恢复快)和AOF(日志更安全)的对比与选择。
四、微服务与架构设计
1. 微服务核心问题
服务熔断与降级
Sentinel实现熔断(慢调用比例阈值触发降级)。
全链路灰度发布
通过Header传递流量标记(Nginx动态路由)或Service Mesh(Istio Sidecar代理)。
Spring Boot自动配置原理
@EnableAutoConfiguration
+META-INF/spring.factories
+ 条件注解(@Conditional
)。
2. 系统架构设计
同城多活架构
数据同步(MySQL Binlog + Kafka)、流量调度(DNS/GSLB)、冲突解决(时间戳/版本号)。
Service Mesh落地难点
Sidecar带来的性能损耗(约10%延迟)和多语言服务治理的统一化挑战。
五、技术场景题(实战向)
1. 高并发场景
如何设计一个百万级QPS的秒杀系统?
分层削峰:Nginx限流 + Redis预减库存(Lua脚本保证原子性) + 消息队列异步处理。
如何解决缓存穿透?
布隆过滤器(拦截无效请求)+ 空值缓存(防止频繁查DB)。
如何防止缓存雪崩?
随机过期时间 + 多级缓存(本地缓存→Redis→DB)+ 熔断降级(Hystrix/Sentinel)。
2. 银行业务相关面试题(加分项)
如何保证金融级数据一致性?
TCC事务(Try-Confirm-Cancel)+ 对账机制(定时核对账务)。
如何防止重复支付?
幂等性设计(唯一订单号 + 状态机)。
银行系统常用的加密算法?
RSA(非对称)、SHA-256(摘要)、国密SM4(对称)。