25年12月天阳科技Java后端开发工程师 二面
1. 如何通过jmap命令生成堆转储文件?
思路
核心讲清命令格式、参数含义,补充实操注意事项,确保新手能直接用。
回答示例
生成堆转储文件的核心命令是jmap -dump,步骤如下:
- 先通过jps获取目标进程ID:
jps # 输出如 12345 MyApplication
- 执行dump命令生成文件:
jmap -dump:format=b,file=heap_dump.hprof 12345
注意:
- 生成dump文件会暂停进程(堆越大暂停越久),建议低峰期执行;
- 可选参数
live(如-dump:live,format=b,file=xxx.hprof):只dump存活对象,文件更小。
2. 雪花算法中workerId的作用是什么?
思路
结合雪花算法结构,讲清workerId的核心目的(区分节点),避免ID重复。
回答示例
雪花算法生成64位Long型ID,结构包含:时间戳+workerId(工作节点ID)+sequence(序列号)。
workerId的核心作用:
- 唯一标识分布式集群中的每个节点/机器(如服务器、容器);
- 保证不同节点在同一毫秒内生成的ID不重复(哪怕sequence相同,workerId不同,最终ID也不同)。
补充:workerId通常配置为机器IP哈希、机房+机器编号等,取值范围一般031/01023(取决于位数,如5位/10位),需手动配置且集群内唯一。
3. Redis的AOF持久化默认同步策略是什么?
思路
明确默认策略,解释含义,对比其他策略,突出“性能与安全平衡”。
回答示例
Redis AOF持久化默认同步策略是everysec(每秒同步):
- 含义:Redis每秒触发一次fsync(),将AOF缓冲区的数据刷到磁盘;
- 特性:
- 其他策略对比:
4. 缓存击穿的典型场景是什么?
思路
定义+典型场景+核心原因,区分缓存穿透/雪崩,避免混淆。
回答示例
缓存击穿是指:一个热点key突然失效(过期/被删除),大量请求瞬间打到数据库,导致数据库压力骤增。
典型场景:
- 秒杀活动的商品ID(热点key),缓存过期瞬间,几万/几十万请求直接查DB;
- 首页热门资讯ID,缓存到期后,高并发请求穿透缓存;
- 缓存被手动删除(如运维误操作),热点key对应的请求全部打DB。
核心区别:
- 穿透:key不存在,缓存和DB都查不到;
- 雪崩:大量key同时失效,DB扛不住;
- 击穿:单个热点key失效,DB被集中攻击。
5. Redisson分布式锁的看门狗机制解决什么问题?
思路
讲清问题场景(锁过期但业务没执行完),再解释看门狗的核心逻辑。
回答示例
看门狗机制主要解决:分布式锁过期后,业务逻辑还没执行完,导致其他线程获取到锁,引发并发问题。
核心逻辑:
- 当线程获取锁时,若未指定过期时间,Redisson自动设置默认30秒过期,并启动看门狗线程;
- 看门狗每隔10秒(过期时间的1/3)检查一次,若当前线程还持有锁,就自动把锁的过期时间续到30秒;
- 当线程执行完业务释放锁,看门狗线程停止,避免锁无限续期。
作用:保证业务逻辑执行期间,锁不会过期,同时避免死锁(线程崩溃后,锁到时间会自动过期)。
6. RocketMQ中MessageQueue的作用是什么?
思路
核心讲“分区+负载均衡+顺序性”,结合生产者/消费者逻辑解释。
回答示例
MessageQueue(消息队列)是RocketMQ的最小消息存储和投递单元,核心作用:
- 负载均衡:一个Topic可分为多个MessageQueue,生产者将消息分发到不同Queue,消费者按组消费不同Queue,实现生产/消费的负载均衡;
- 顺序消息:同一Queue内的消息严格有序,生产者将需要保证顺序的消息(如同一订单的操作)发往同一个Queue,消费者单线程消费该Queue,保证消息顺序;
- 存储分片:每个Queue对应独立的存储文件,便于消息的存储、清理、扩容。
补充:Topic是逻辑概念,MessageQueue是物理概念,Topic的消息实际存在各个Queue中。
7. Nacos服务注册时客户端发送的心跳间隔默认是多少?
思路
明确默认值,补充超时剔除规则,结合健康检查逻辑。
回答示例
Nacos客户端默认每5秒向服务端发送一次心跳包(包含服务实例的健康状态)。
配套规则:
- 服务端若15秒未收到心跳,将实例标记为“不健康”;
- 若30秒仍未收到心跳,直接将实例从服务列表中剔除;
- 可通过配置修改:
nacos.instance.heart-beat-interval(心跳间隔)、nacos.instance.heart-beat-timeout(心跳超时)、nacos.instance.ip-delete-timeout(剔除超时)。
8. 单例模式中双重检查锁为什么要加volatile?
思路
讲清指令重排序问题,结合对象创建的三步流程,解释volatile的作用。
回答示例
双重检查锁(DCL)的单例代码如下,volatile必须加:
public class Singleton {
private static volatile Singleton instance; // 必须加volatile
private Singleton() {}
public static Singleton getInstance() {
if
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
查看2道真题和解析