Good morning, my name is liuhaijin.I'm from Longhui, Hunan I graduated from Hunan International Economics University with a bachelor's degree.
I'm a Java developer with six years of experience in software development.
I specialize in backend development using Java ecosystem including Spring Boot, JPA、Mybatis, and microservices architecture.
In my current role at Eastern Communication Company, I've successfully delivered projects involving psychological helper APP, microservice gateway.
I'm eager to bring my technical skills and problem-solving abilities to your team. Thank you for this opportunity to introduce myself.
JPA 面试题精选(附简洁答案)
基础概念
-
JPA 和 Hibernate 的关系?
A: JPA 是规范,Hibernate 是最流行的实现。类似 JDBC 与 MySQL 驱动的关系。 -
Entity 必须满足的条件?
A: ①@Entity
注解 ② 无参构造器 ③ 非final类 ④ 有主键(@Id
)
核心注解
-
@Id
和@GeneratedValue
的作用?
A:-
@Id
:标记主键 -
@GeneratedValue
:主键生成策略(AUTO/IDENTITY/SEQUENCE/TABLE)
-
-
@OneToMany
默认加载策略?如何优化N+1问题?
A:-
默认LAZY加载
-
优化:
@EntityGraph
或JOIN FETCH
-
缓存机制
-
JPA 一级缓存 vs 二级缓存?
A:-
一级缓存:EntityManager级别,事务内有效
-
二级缓存:跨Session,需要额外配置(如Ehcache)
-
事务管理
-
@Transactional
注解失效的常见场景?
A:
① 非public方法
② 同类方法调用(未通过代理)
③ 异常类型不匹配
④ 多线程调用
性能优化
-
如何批量插入10万条数据?
A:-
使用
EntityManager#persist()
+批次flush -
设置
hibernate.jdbc.batch_size=500
-
关闭二级缓存
-
高级特性
-
JPA 如何实现乐观锁?
A: 添加@Version
注解字段,更新时自动检查版本号。 -
@Embeddable
的作用?
A: 将多个字段组合为值对象(如Address),可嵌入到Entity中复用。
常见问题排查
-
LazyInitializationException 怎么解决?
A:
① 事务范围内完成操作
②@Transactional
注解
③FetchType.EAGER
(慎用)
④ Hibernate.initialize()主动初始化
对比题
-
JPA 与 MyBatis 核心区别?
A:-
JPA:ORM框架,面向对象操作
-
MyBatis:SQL映射框架,灵活SQL控制
-
附:记忆技巧
-
注解记关键3个:
@Entity
@Id
@Transactional
-
性能问题记:N+1用FETCH,批量调size,缓存分两级
-
异常记:Lazy→事务,OptimisticLock→版本号
Jenkins 面试题精选
-
Jenkins 是什么?核心功能?
A: 开源CI/CD工具,核心功能包括:自动化构建、测试、部署,支持流水线(Pipeline) -
Jenkinsfile 是什么?
A: 用代码定义的CI/CD流程,支持Groovy语法,分为声明式(Declarative)和脚本式(Scripted)
-
Jenkins 架构主要组件?
A:-
Master:调度任务、管理界面
-
Agent/Node:实际执行任务的节点
-
Executor:单个任务执行线程
-
-
什么是 Jenkins Pipeline?优势?
A:-
将整个CI/CD流程代码化
-
优势:版本控制、可复用、可视化、支持复杂流程
-
常用插件
-
列举5个常用插件及作用
A:
① Git:源码拉取
② Docker:容器化构建
③ Blue Ocean:可视化界面
④ SonarQube:代码质量检测
⑤ Credentials:凭据管理
-
如何实现自动化触发构建?
A:
① Webhook触发(GitHub/GitLab)
② 定时触发(cron语法)
③ 上游任务触发
-
Jenkinsfile 与传统Freestyle项目区别?
A:-
Freestyle:通过界面配置,适合简单任务
-
Jenkinsfile:代码化配置,适合复杂流程,可版本控制
-
附:记忆口诀
-
核心三件套:Master/Agent/Pipeline
-
优化四要素:节点/清理/并发/轻量
-
故障排查法:日志/重试/超时/可视化
多线程面试题
Java创建线程的3种方式?
A:
-
继承
Thread
类(不推荐,单继承限制) -
实现
Runnable
接口(推荐,可复用) -
实现
Callable
接口(可返回结果,配合FutureTask
)
Runnable
vs Callable
?
A:
-
Runnable
:run()
无返回值 -
Callable
:call()
可返回结果,可抛异常
线程安全
Q: synchronized
的3种用法?
A:
-
修饰实例方法(锁当前对象)
-
修饰静态方法(锁类对象)
-
同步代码块(锁指定对象)
Q: volatile
的作用?
A:
-
保证可见性(直接读写主存)
-
禁止指令重排序(防止JVM优化)
-
不保证原子性(如
i++
仍需synchronized
)
ReentrantLock
和 synchronized
的区别?
A:
特性 | synchronized |
ReentrantLock |
---|---|---|
锁获取 | JVM自动管理 | 手动 lock() /unlock() |
可中断 | ❌ | ✅(lockInterruptibly() ) |
公平锁 | ❌ | ✅(构造函数设置) |
条件变量 | wait() /notify() |
Condition 更灵活 |
线程池的7大核心参数?
A:
-
corePoolSize
(核心线程数) -
maxPoolSize
(最大线程数) -
keepAliveTime
(空闲线程存活时间) -
workQueue
(任务队列,如LinkedBlockingQueue
) -
threadFactory
(线程工厂) -
handler
(拒绝策略,如AbortPolicy
) -
unit
(时间单位)
线程池的4种拒绝策略?
A:
-
AbortPolicy
(默认,抛异常) -
CallerRunsPolicy
(回退给调用者执行) -
DiscardPolicy
(静默丢弃) -
DiscardOldestPolicy
(丢弃队列最老任务)
并发工具类
Q: CountDownLatch
和 CyclicBarrier
的区别?
A:
特性 | CountDownLatch |
CyclicBarrier |
---|---|---|
计数 | 单向递减(countDown() ) |
可重置(reset() ) |
用途 | 等待多个任务完成 | 多个线程互相等待 |
复用 | ❌ | ✅ |
ThreadLocal
的作用和内存泄漏问题?
A:
-
作用:线程私有变量,避免共享问题(如
SimpleDateFormat
) -
内存泄漏:线程池中线程存活时间长,
ThreadLocal
未remove()
导致无法回收
如何避免死锁?(死锁的四个必要条件是:互斥、占有且等待、不可抢占和循环等待。)
A:
-
按固定顺序获取锁(如
A→B
,避免A←→B
) -
设置超时(
tryLock(timeout)
) -
死锁检测(如
jstack
分析)
记忆技巧
-
线程安全三件套:
synchronized
、volatile
、Lock
-
线程池四要素:核心数、队列、拒绝策略、非核心线程存活时间
-
并发工具类:
CountDownLatch
(减数)、CyclicBarrier
(循环栅栏)
JDK 17 新特性面试题
密封类(Sealed Classes)是什么?如何使用?
-
作用:限制哪些类可以继承/实现它
模式匹配(Pattern Matching)
instanceof
模式匹配怎么用?
✅ A: 直接转换变量,避免额外强制类型转换:
记忆技巧
-
Java 版本:Spring Boot 3 == Java 17+(记住 LTS 版本)
-
包名变更:
javax
→jakarta
(影响所有持久化、Web 相关代码) -
依赖冲突:优先检查 Hibernate、Jackson、数据库驱动
✅ 面试加分点:结合项目经验,例如:
“我们在升级时用
spring-boot-migrator
自动修复了 80% 的兼容性问题”“通过分模块升级,将停机时间控制在 2 小时内”
Docker 面试题
Docker 和虚拟机的区别?
-
Docker:轻量级,共享宿主机内核,启动快(秒级),资源占用少,适合微服务。
-
虚拟机:完整 OS,独立内核,启动慢(分钟级),资源占用高,适合强隔离场景。
Dockerfile 常用指令?
FROM # 基础镜像
COPY # 复制文件
RUN # 执行命令
EXPOSE # 暴露端口
CMD # 容器启动命令
ENV # 设置环境变量
VOLUME # 挂载数据卷
多阶段构建减少镜像大小(如 FROM builder AS build
+ FROM alpine
)。
如何进入运行中的容器
docker exec -it <container_id> /bin/bash
如何减少 Docker 镜像体积?
-
使用
alpine
基础镜像 -
多阶段构建(如
maven
构建 +jre
运行) -
清理缓存(如
apt-get clean
)
Docker 数据持久化方式?
-
Volume(Docker 管理,
docker volume create
) -
Bind Mount(直接挂载主机目录,
-v /host/path:/container/path
)
Kubernetes (K8s) 面试题
Kubernetes 核心组件?
-
Master:API Server、Scheduler、Controller Manager、etcd
-
Node:kubelet、kube-proxy、容器运行时(Docker/containerd)
2. Pod 是什么?
-
最小调度单元,包含 1 个或多个容器(共享网络/存储)。
-
特点:临时性(可被销毁重建),通过
Deployment
管理生命周期。
3. Service 类型?
-
ClusterIP(默认,集群内部访问)
-
NodePort(暴露节点端口)
-
LoadBalancer(云厂商 LB)
-
ExternalName(DNS 映射)
4. Deployment vs StatefulSet
-
Deployment:无状态应用(如 Web 服务),支持滚动更新。
-
StatefulSet:有状态应用(如 MySQL),保证 Pod 唯一性、持久存储。
5. 如何排查 Pod 一直 Pending?
-
kubectl describe pod <pod_name>
查看事件 -
常见原因:资源不足、NodeSelector 不匹配、PV 未绑定。
Kafka 面试题
Kafka 为什么高性能?
-
顺序磁盘 I/O(日志追加写入)
-
零拷贝(
sendfile
减少 CPU 拷贝) -
批量发送(
batch.size
+linger.ms
)
2. 如何保证消息不丢失?
-
Producer:
acks=all
(等待所有副本确认) -
Broker:
replication.factor ≥ 3
(多副本) -
Consumer:手动提交 Offset(
enable.auto.commit=false
)
3. ISR 是什么?
-
In-Sync Replicas(同步副本集合),Leader 故障时从 ISR 选举新 Leader。
4. 消费者组(Consumer Group)作用?
-
负载均衡:组内消费者分摊分区消息。
-
容错:消费者宕机后,分区重新分配。
Kafka vs RabbitMQ
特性 | Kafka | RabbitMQ |
---|---|---|
吞吐量 | 高(百万级) | 中(万级) |
消息顺序 | 分区有序 | 队列有序 |
适用场景 | 日志/流处理 | 企业级消息队列 |
MQ(消息队列)面试题
为什么用消息队列?
-
解耦(生产者消费者独立)
-
异步(非阻塞调用)
-
削峰(缓冲高并发请求)
2. RabbitMQ 如何保证消息可靠?
-
持久化(队列+消息+交换机)
-
ACK 机制(手动确认
basic_ack
) -
事务/Confirm 模式(确保消息到达 Broker)
3. 消息积压怎么处理?
-
临时方案:增加消费者实例
-
长期方案:优化消费逻辑(如批量处理)
4. 如何避免重复消费?
-
幂等设计(如数据库唯一键)
-
Redis 记录已处理消息 ID
总结
-
Docker:轻量、镜像优化、数据持久化
-
K8s:Pod/Service/Deployment、故障排查
-
Kafka:高性能、ISR、Exactly-Once
-
MQ:解耦、可靠投递、幂等性
建议结合项目经验回答(如“我们用 Kafka 处理日志,通过 acks=all
确保不丢失”)。
Redis面试
Redis 是什么?主要用途?
✅ A:
-
内存数据库,支持持久化,单线程高性能
-
用途:缓存、会话存储、排行榜、消息队列
Q: Redis 为什么快?
✅ A:
-
内存操作(纳秒级响应)
-
单线程(避免锁竞争,IO多路复用)
-
高效数据结构(如哈希表、跳表)
2. 数据类型与使用场景
Q: Redis 5种核心数据类型及场景?
✅ A:
类型 | 示例命令 | 典型场景 |
---|---|---|
String | SET/GET |
缓存、计数器 |
Hash | HSET/HGET |
存储对象(如用户信息) |
List | LPUSH/LPOP |
消息队列、最新消息 |
Set | SADD/SMEMBERS |
标签、好友关系 |
ZSet | ZADD/ZRANGE |
排行榜、延迟队列 |
Q: 如何实现分布式锁?
SET lock_key unique_value NX PX 30000 # NX(不存在才设置)+ PX(过期时间)
关键点:
-
唯一值防误删(如UUID)
-
设置过期时间避免死锁
持久化与高可用
Q: RDB 和 AOF 的区别?
✅ A:
RDB | AOF |
---|---|
快照存储(二进制) | 日志追加(可读文本) |
恢复快,可能丢数据 | 数据更安全,文件更大 |
SAVE/BGSAVE 触发 |
支持 fsync 策略(每秒/始终) |
Q: Redis 集群方案有哪些?
✅ A:
-
主从复制(读写分离,主节点故障需手动切换)
-
哨兵模式(自动故障转移,监控主从状态)
-
Cluster 模式(分片存储,16384个槽位,自动重平衡)
性能优化
Q: 如何解决缓存穿透?
✅ A:
-
布隆过滤器(拦截无效请求)
-
缓存空值(
SET null 60s
)
Q: 如何避免缓存雪崩?
✅ A:
-
随机过期时间(如基础时间+随机偏移)
-
多级缓存(本地缓存+Redis)
-
熔断降级(如 Hystrix)
Redis 内存满了怎么办?
✅ A:
-
淘汰策略(如
volatile-lru
删除最近最少使用的带过期键) -
分片集群(水平扩展)
-
压缩数据(如用 Hash 代替多个 String)
Q: 如何保证缓存与数据库一致性?
✅ A:
-
先更新DB,再删缓存(延迟双删更保险)
-
监听Binlog(如 Canal 同步到Redis)
记忆技巧
-
数据类型:String(简单)、Hash(对象)、List(队列)、Set(去重)、ZSet(排序)
-
高可用三件套:主从、哨兵、Cluster
-
缓存问题:穿透(空值/布隆)、雪崩(随机过期)、击穿(互斥锁)
✅ 加分点:结合项目举例,如“用ZSet实现电商秒杀排行榜,QPS 10万+”。
多主多从架构解析
什么是多主多从?
✅ 定义:
-
多主(Multi-Master):多个节点均可写入,数据双向同步。
-
多从(Multi-Slave):多个节点只读,从主节点单向同步数据。
2. 典型应用场景
场景 | 说明 | 示例 |
---|---|---|
读写分离 | 主节点写入,从节点分担读压力 | 电商商品页(读多写少) |
高可用 | 主节点故障时快速切换 | 金融交易系统(低容错时间) |
地理分布式部署 | 多地就近读写 | 全球游戏服务器(降低延迟) |
3. 实现方式
数据库(如MySQL):
-
多主:通过Galera Cluster、MySQL Group Replication实现多主同步。
-
多从:通过主从复制(binlog)扩展读性能。
Redis:
-
多主:Redis Cluster模式(分片存储,每个分片主从结构)。
-
多从:主从复制+哨兵(Sentinel)自动故障转移。
Kafka:
-
多主:每个分区(Partition)有Leader(可读写)和Follower(只同步)。
4. 核心挑战与解决方案
问题 | 解决方案 |
---|---|
数据冲突 | 时间戳/版本号合并(如CRDT数据结构) |
同步延迟 | 最终一致性+监控告警 |
脑裂(Split-Brain) | 仲裁节点(如ZooKeeper) |
5. 面试回答模板
Q: 多主多从架构的优缺点?
✅ A:
-
优点:
-
高可用(节点冗余)
-
负载均衡(读写分离)
-
容灾(多地部署)
-
-
缺点:
-
数据一致性难保证(需权衡CAP)
-
运维复杂度高(如冲突解决)
-
6. 记忆口诀
-
多主多从 = 读写扩展 + 高可用
-
三核心问题:冲突、延迟、脑裂
-
场景匹配:读多写少选从库,多地部署用多主
✅ 加分点:结合项目举例,如“在支付系统中,用MySQL多主同步实现跨机房容灾,通过GTID解决数据冲突”。