乐信科技 Java后端一面面经
《面试题目》
一面:
- 实习经历深挖 + 八股文。
- RocketMQ作为消息队列,它的核心组件和运行原理是怎样的?
- Broker的作用是什么?对应的topic呢?
- 消费失败后,后续的重试机制是怎样的?比如重试次数、间隔时间。
- 假如JVM出现CPU占用率比较高的情况,你怎么排查?
- 打印JVM堆快照用什么命令?
- Java的锁升级过程是怎样的?
- 锁信息是怎么存储的?存在哪个对象里?
- 在Spring框架下,要连接两个数据库实例(比如主从库),怎么实现数据源切换?
- 你现在编程时会用什么AI代理或大模型?
- 自己做过RAG智能体的检索功能吗?用什么代码编写的?
- 对接的是什么AI能力?用的哪个Agent?
《参考解析》
- RocketMQ核心组件:主要包含NameServer(注册中心)、Broker(消息存储与转发)、Producer(生产者)和Consumer(消费者)。原理是通过NameServer管理Broker集群,实现负载均衡与路由寻址。
- 消费重试机制:RocketMQ默认有16个重试等级(10s, 30s, 1m…2h)。消费失败后消息进入重试队列(%RETRY%Group),达到最大次数后进入死信队列(DLQ)。
- CPU高负载排查:使用
top定位高CPU进程,top -Hp pid定位线程,jstack导出线程栈分析热点代码,或使用arthas的thread命令直接查看。 - JVM堆快照命令:使用
jmap -dump:format=b,file=heap.hprof <pid>命令生成快照文件,后续通过MAT或VisualVM进行内存分析。 - 锁升级过程:Java对象头包含Mark Word,锁升级遵循:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。升级是为了减少获取锁带来的性能开销。
- 多数据源切换:在Spring中通常利用
AbstractRoutingDataSource,通过重写determineCurrentLookupKey方法,结合AOP注解标记当前线程应使用的数据源Key,实现动态切换。