25年10月抖音 Java开发实习生二面

#JAVA##JAVA面经##JAVA内推#

实习期间做过最有成就感或最棘手的需求是啥?

“虽暂无企业实习经历,但在校园二手平台项目中,我主导开发了高并发秒杀模块(类比实习场景):

  • 背景:校园活动期间瞬时流量激增(预估500+并发),需防超卖、保系统稳定
  • 我的职责:方案设计→编码→压测→上线全流程
  • 设计方案
    1️⃣ 流量削峰:RabbitMQ异步队列缓冲请求(设置预热队列防突发)
    2️⃣ 库存控制
    • Redis Lua脚本原子扣减(if stock>0 then decr key end
    • 数据库乐观锁二次校验(version字段)
    3️⃣ 防刷机制:用户维度限流(Guava RateLimiter 3次/秒)+ 验证码
  • 成果:JMeter压测1000并发零超卖,接口P99<200ms
  • 反思:初期忽略Redis缓存击穿,用布隆过滤器+空值缓存补救。最大收获:高并发设计需‘理论+压测+监控’三位一体,任何环节缺失都可能线上事故。”

用 RocketMQ 时,如何保证消息严格有序?

“项目中使用RabbitMQ,但深入研究过RocketMQ有序消息机制:
核心方案

  • 队列级有序:同一业务标识(如订单ID)的消息发送到同一MessageQueue
    producer.send(msg, new MessageQueueSelector() {
        @Override
        public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
            Long orderId = (Long) arg;
            return mqs.get((int)(orderId % mqs.size())); // 按订单ID哈希固定队列
        }
    }, orderId);
    
  • 消费端:单线程消费该队列(避免多线程乱序)
    ⚠️ 踩坑认知
  • 若消费者故障转移,新实例需等待原实例释放队列锁,短暂无序(业务层需幂等兜底)
  • 对比RabbitMQ:RabbitMQ需为每个订单建独立队列(运维成本高),RocketMQ的队列复用更优雅
    态度:技术选型需匹配业务——订单状态流转用有序消息,通知类消息用普通队列提升吞吐。”

看 EXPLAIN 优化慢 SQL,重点关注哪些字段?

“三字段定乾坤:
🔹 type

  • 目标:ref/range(走索引)
  • 警惕:index(全索引扫描)、ALL(全表扫描)→ 立即加索引
    🔹 rows
  • 预估扫描行数,若>总数据10%需警惕(如10万表扫5万行)
  • 结合filtered看有效过滤率
    🔹 Extra
  • Using index:覆盖索引,最优
  • ⚠️ Using filesort:ORDER BY未走索引 → 加联合索引
  • ⚠️ Using temporary:GROUP BY临时表 → 优化分组字段索引
    实战案例:曾优化‘用户订单查询’,将(user_id)单列索引改为(user_id, create_time)typeindexrangerows从8000→15,耗时从1.2s→40ms。”

Linux查日志定位"timeout"行,命令组合?

“高效组合三式:
1️⃣ 实时追踪tail -f app.log | grep --color=auto "timeout"(高亮关键词)
2️⃣ 精准定位grep -n "timeout" app.log | tail -20(显示行号+最后20条)
3️⃣ 上下文关联grep -B 2 -A 3 "timeout" app.log(显示匹配行前后2/3行,快速定位堆栈)
进阶技巧

  • 大日志文件:less +/timeout app.log(less内搜索)
  • 多文件:grep -r "timeout" /var/log/myapp/ --include="*.log"
  • 排除干扰:grep "timeout" app.log | grep -v "connect"(过滤含connect的timeout)”

端口被占用,查进程命令?

“两步精准定位:
1️⃣ 查进程PID
lsof -i :8080(推荐,输出含进程名/用户)
备选netstat -tunlp | grep :8080
2️⃣ 处理进程
kill -9 <PID>(强制终止)
安全操作:先ps -p <PID> -o comm=确认进程名,避免误杀
实战习惯:部署脚本开头加lsof -ti :8080 | xargs kill -9 2>/dev/null,确保端口释放。”

Java 异常体系,运行时异常 vs 受检异常?

核心分界:是否需显式处理(try-catch/throws)
🔹 运行时异常(RuntimeException子类)

  • 例:NullPointerException(空指针)、IllegalArgumentException(参数非法)、ConcurrentModificationException(遍历中修改集合)
  • 特点:程序逻辑错误,应编码避免,通常不捕获
    🔹 受检异常(Exception子类,非RuntimeException)
  • 例:IOException(文件读写)、SQLException(数据库操作)、ClassNotFoundException
  • 特点:外部环境导致,必须处理(如重试/降级)
    项目实践
  • 自定义业务异常继承RuntimeException(如OrderNotFoundException),简化Controller层
  • 受检异常统一转换:MyBatis

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

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

27届求职交流
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

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