经纬恒润 Java开发 二面 面经

Java后端开发二面题目(完整版)

1. 说说Spring Boot的自动装配原理是如何实现的?

答案:

核心机制:

  • @SpringBootApplication包含三个注解
  • @EnableAutoConfiguration触发自动装配
  • @Import(AutoConfigurationImportSelector.class)导入配置

装配流程:

  1. 读取META-INF/spring.factories文件
  2. 加载所有EnableAutoConfiguration配置类
  3. 根据@Conditional条件注解过滤
  4. 将符合条件的Bean注册到容器

常见条件注解:

  • @ConditionalOnClass:类路径存在某个类
  • @ConditionalOnMissingBean:容器中没有某个Bean
  • @ConditionalOnProperty:配置文件有某个属性

自定义starter:

  • 创建配置类加@Configuration
  • spring.factories中注册
  • 使用条件注解控制加载

2. Redis的数据结构有哪些?分别适用什么场景?

答案:

String(字符串):

  • 场景:缓存、计数器、分布式锁
  • 命令:SET、GET、INCR、DECR

Hash(哈希):

  • 场景:存储对象、购物车
  • 命令:HSET、HGET、HMGET
  • 优势:节省内存,部分更新

List(列表):

  • 场景:消息队列、时间线、最新列表
  • 命令:LPUSH、RPUSH、LPOP、RPOP
  • 特点:有序、可重复

Set(集合):

  • 场景:标签、共同好友、去重
  • 命令:SADD、SMEMBERS、SINTER
  • 特点:无序、不重复

ZSet(有序集合):

  • 场景:排行榜、延迟队列
  • 命令:ZADD、ZRANGE、ZRANK
  • 特点:按score排序

其他类型:

  • Bitmap:签到、布隆过滤器
  • HyperLogLog:UV统计
  • GEO:地理位置
  • Stream:消息队列(5.0+)

3. 分布式事务有哪些解决方案?各有什么优缺点?

答案:

1. 2PC(两阶段提交)

  • 准备阶段:协调者询问参与者
  • 提交阶段:统一提交或回滚
  • 缺点:同步阻塞、单点故障、数据不一致

2. 3PC(三阶段提交)

  • 增加CanCommit阶段
  • 超时机制
  • 缺点:复杂度高

3. TCC(Try-Confirm-Cancel)

  • Try:预留资源
  • Confirm:确认提交
  • Cancel:取消回滚
  • 优点:性能好、无锁
  • 缺点:业务侵入性强

4. 本地消息表

  • 业务和消息在同一事务
  • 定时扫描发送消息
  • 优点:实现简单
  • 缺点:依赖定时任务

5. 消息队列(最终一致性)

  • 发送消息到MQ
  • 消费者处理业务
  • 优点:解耦、高性能
  • 缺点:只能保证最终一致

6. Seata(推荐)

  • AT模式:自动补偿
  • TCC模式:手动补偿
  • SAGA模式:长事务
  • 优点:对业务侵入小

选型建议:

  • 强一致性:TCC、Seata AT
  • 最终一致性:消息队列
  • 简单场景:本地消息表

4. JVM内存模型是怎样的?如何排查内存溢出问题?

答案:

内存区域:

线程共享:

  • 堆(Heap):对象实例、数组
  • 方法区(元空间):类信息、常量、静态变量

线程私有:

  • 虚拟机栈:局部变量、方法调用
  • 本地方法栈:Native方法
  • 程序计数器:字节码行号

常见OOM:

1. 堆溢出(最常见)

  • 原因:对象过多、内存泄漏
  • 错误:java.lang.OutOfMemoryError: Java heap space
  • 排查: jmap -heap pid查看堆使用jmap -dump:format=b,file=heap.hprof pid导出堆MAT工具分析dump文件

2. 栈溢出

  • 原因:递归太深、线程过多
  • 错误:StackOverflowError
  • 解决:增加栈大小-Xss

3. 元空间溢出

  • 原因:类加载过多
  • 错误:OutOfMemoryError: Metaspace
  • 解决:增加元空间-XX:MetaspaceSize

排查步骤:

  1. 查看GC日志:-XX:+PrintGCDetails
  2. 使用jstat监控:jstat -gc pid 1000
  3. dump堆分析:找到占用内存最多的对象
  4. 分析代码:是否有内存泄漏

预防措施:

  • 合理设置堆大小
  • 及时释放资源
  • 使用对象池
  • 避免大对象

5. MySQL的事务隔离级别有哪些?如何解决幻读问题?

答案:

四种隔离级别:

1. 读未提交(Read Uncommitted)

  • 可以读到未提交的数据
  • 问题:脏读、不可重复读、幻读

2. 读已提交(Read Committed)

  • 只能读到已提交的数据
  • 问题:不可重复读、幻读
  • Oracle默认级别

3. 可重复读(Repeatable Read)

  • 同一事务内多次读取结果一致
  • 问题:幻读
  • MySQL默认级别

4. 串行化(Serializable)

  • 完全串行执行
  • 无并发问题,性能最差

并发问题:

  • 脏读:读到未提交的数据
  • 不可重复读:两次读取数据不一致
  • 幻读:两次查询记录数不一致

MySQL如何解决幻读:

MVCC(多版本并发控制):

  • 每行记录有隐藏字段:事务ID、回滚指针
  • 读取时根据ReadView判断可见性
  • 快照读不会产生幻读

Next-Key Lock(间隙锁):

  • 锁定记录+间隙
  • 防止其他事务插入
  • 当前读(SELECT FOR UPDATE)使用

示例:

-- 事务A
BEGIN;
SELECT * FROM table WHERE id > 10 FOR UPDATE;
-- 锁定id>10的记录和间隙,事务B无法插入

-- 事务B
INSERT INTO table VALUES(15, ...); -- 阻塞

6. 如何设计一个秒杀系统?需要考虑哪些问题?

答案:

核心问题:

  • 高并发:瞬间大量请求
  • 超卖:库存扣减不一致
  • 恶意请求:刷单、爬虫

架构设计:

前端优化:

  • 按钮置灰,防止重复点击
  • 验证码、滑块验证
  • 静态资源CDN加速

接口层:

  • Nginx限流:限制单IP请求频率
  • 网关限流:令牌桶、漏桶算法
  • 接口防刷

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论
向大佬学习学习
点赞 回复 分享
发布于 昨天 22:46 河南

相关推荐

一、 个人背景与综合意向- 自我介绍:请进行简单的自我介绍。- 业务背景:该规则引擎主要应用于唯品会的哪些具体业务场景?- 团队情况:你所在组的整体开发团队规模是多少?纯后端开发人员有多少?- 实习时间:如果入职,什么时候可以开始实习?打算实习多长时间?二、 Java 基础(重点考察 HashMap)- 数据结构:请介绍一下 HashMap 内部的数据结构。- 设计原理:为什么 HashMap 要引入红黑树?这样设计的根本目的和好处是什么?- 底层支撑:为什么底层要基于数组加链表的形式来实现哈希表?数组的作用是什么?- 哈希计算:JDK 1.8 中,哈希函数是如何计算哈希值并确定元素在桶中位置的?(扰动函数的作用)- 并发安全:HashMap 是如何保证线程安全的?具体到 JDK 1.8,它是如何利用 CAS 和 synchronized 实现的?- 不安全场景:在多线程环境下使用普通的 HashMap 会出现哪些具体的并发安全问题?(例如:值覆盖、扩容死循环等)三、 Spring 框架- 核心机制:请解释一下 Spring 的循环依赖问题以及它是如何通过三级缓存解决的?- 缓存细节:每一级缓存分别存的是什么?为什么非要引入“三级缓存”而不能只用二级缓存?(涉及 Bean 生命周期与 AOP 适配)四、 项目深度挖掘(规则引擎)- 项目核心:请详细介绍一下你负责的规则引擎项目,包括你的角色和核心产出。- 难点与挑战:在该项目中,让你印象最深刻的技术难点或业务难点是什么?- 稳定性治理:你是如何实现规则的多版本快照和回滚功能的?- 数据库设计:为了兼容旧表并实现多版本功能,你在表结构上做了哪些具体修改?- 业务逻辑:当规则出现问题时,业务人员如何通过后台系统排查过去的执行情况?- **回调机制**:业务回调功能是如何设计的?为什么要做异步优化?- 可靠性考量:如果系统在回调过程中重启,线程池阻塞队列里的任务丢失了怎么办?如何保证数据一致性?- 性能优化:你是如何发现规则执行链路存在耗时问题的?具体的优化手段(核心与非核心链路拆分)是什么?- 系统指标:该系统的平均耗时(RT)和峰值 QPS 大约是多少?五、 工程能力与运维排查- 监控手段:你们是如何对线上规则的执行时间进行监控的?- 线上排查:如果线上出现问题,你的排查流程是什么?- 容器化知识:线上系统是容器化部署吗?你对 Docker 或 K8S 有多少了解?- 日志定位:在容器环境下,你如何查找和定位历史日志文件?
查看25道真题和解析
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务