1. Java实习面试核心要点解析
作为过来人,我完整经历了3次Java实习面试的全过程。从最初的简历石沉大海,到最终斩获3个offer,这段经历让我深刻认识到:Java实习面试本质上是在考察"基础扎实度+项目理解深度+临场应变能力"的三维组合。下面就从技术栈拆解、高频问题剖析和实战技巧三个维度,分享我的真实面经。
2. 必考技术栈深度剖析
2.1 线程池的七种武器
面试官最常问的线程池问题往往从这段代码开始:
ThreadPoolExecutor executor = new ThreadPoolExecutor( 5, // corePoolSize 10, // maximumPoolSize 60L, // keepAliveTime TimeUnit.SECONDS, new LinkedBlockingQueue<>(100) );需要吃透的七个参数本质:
- corePoolSize:就像餐厅常驻厨师,即使没订单也要发基本工资
- maximumPoolSize:旺季时临时雇佣的兼职厨师上限
- keepAliveTime:兼职厨师空闲多久会被解雇
- unit:解雇计时单位
- workQueue:候餐区座位数(队列容量)
- threadFactory:厨师的招聘标准
- handler:座位满员时的拒单策略
踩坑实录:曾因将队列设为SynchronousQueue导致任务被拒绝,后来明白这种队列相当于没有候餐区,来单必须立即处理。
2.2 AOP的三种打开方式
以记录方法入参出参为例,面试常考的三种实现:
- 注解派:
@Around("@annotation(com.demo.Log)") public Object logAround(ProceedingJoinPoint joinPoint) { // 获取入参 Object[] args = joinPoint.getArgs(); // 执行原方法 Object result = joinPoint.proceed(); // 记录出参 return result; }- 表达式派:
@Around("execution(* com.demo.service.*.*(..))")- 接口派:
public interface Loggable { default Object logMethod(ProceedingJoinPoint pjp) throws Throwable { // 切面逻辑 } }3. 中间件实战问答精要
3.1 RabbitMQ的死亡三连问
消息丢了怎么办:
- 开启confirm模式(生产者确认)
- 开启return回调(路由失败通知)
- 消息落库+定时任务补偿
- 消费者手动ack
消息重复消费:
- 接口幂等设计(唯一约束/状态机)
- Redis防重token
- 业务字段校验
队列积压:
- 临时扩容消费者
- 降级非核心业务
- 死信队列隔离
3.2 Nacos配置中心三板斧
// 1. 动态刷新配置 @RefreshScope public class ConfigService { @Value("${app.config}") private String config; } // 2. 多环境隔离 spring: profiles: active: dev // 3. 配置回滚 curl -X POST "http://nacos:8848/nacos/v1/cs/history?dataId=app.properties&group=DEFAULT_GROUP&nid=123"4. 高频场景题破解之道
4.1 OOM故障排查四步法
- 现场保留:
jmap -dump:format=b,file=heap.hprof <pid> - 初步诊断:
jstat -gcutil <pid> 1000 5 - 线程分析:
jstack <pid> > thread.txt - MAT分析:
- Histogram看对象分布
- Leak Suspects找嫌疑犯
- Dominator Tree查引用链
4.2 设计模式实战三例
- 策略模式支付场景:
interface Payment { void pay(BigDecimal amount); } @Slf4j class Alipay implements Payment { public void pay(BigDecimal amount) { log.info("支付宝支付:{}", amount); } }- 观察者模式订单通知:
orderService.addObserver((o, arg) -> { // 发送短信通知 });- 装饰器模式数据加密:
new CompressionDecorator( new EncryptionDecorator( new FileDataSource("data.txt") ) )5. 面试实战技巧
5.1 项目讲解黄金结构
STAR法则:
- Situation:日均10万订单的电商系统
- Task:需要优化支付超时问题
- Action:引入RabbitMQ延迟队列
- Result:超时率从5%降至0.3%
技术深挖准备:
- 为什么选RabbitMQ而不是Kafka?
- 消息堆积怎么监控?
- 如何保证事务一致性?
5.2 白板编码三板斧
- 明确需求(先问清楚边界条件)
- 写测试用例(展示工程思维)
- 边写边讲(暴露思考过程)
// 示例:手写LRU缓存 class LRUCache { private LinkedHashMap<Integer, Integer> cache; public LRUCache(int capacity) { this.cache = new LinkedHashMap<>(capacity, 0.75f, true) { protected boolean removeEldestEntry(Map.Entry eldest) { return size() > capacity; } }; } }6. 避坑指南
线程池配置误区:
- CPU密集型:核心数 = CPU核数 + 1
- IO密集型:核心数 = CPU核数 * 2
- 混合型:Runtime.getRuntime().availableProcessors()动态调整
AOP失效的四种情况:
- 同类方法调用(this.method())
- 非Spring管理对象
- final方法
- 静态方法
RabbitMQ内存控制:
# 设置内存阈值 rabbitmqctl set_vm_memory_high_watermark 0.6 # 启用磁盘报警 rabbitmqctl set_disk_free_limit 1GB
最后分享一个真实案例:在某次二面时,面试官突然要求在白板上画JVM内存模型。正当我准备画标准结构时,突然追问:"如果Metaspace满了,你的监控系统要怎么设计报警?"这提醒我们:Java面试正在从"八股文"向"场景解决方案"深度演进。建议平时多在自己的项目中实践这些技术点,面试时才能言之有物。