Java · 05 常见问题
1. 语言 / JVM
| 问题 | 怎么看 | 怎么动 |
|---|---|---|
| OOM / 堆飙高 | 泄漏或缓存无界居多 | dump、看占支配类、查本地/Redis 缓存上限 |
| 频繁 Full GC | 分配过快或存活集太大 | 先减分配与缓存,再谈调参 |
| CPU 飙高 | 死循环、锁竞争、正则/序列化 | 采样线程栈,对准热点方法 |
| 启动很慢 | 扫描面过大、依赖重、磁盘慢 | 启动报告、精简自动配置 |
| 元空间 OOM | 动态类/代理过多或泄漏 | 查热部署、脚本引擎、反射生成 |
原则:没有证据不调 GC 参数当第一反应。
2. 并发与线程池
| 问题 | 常见原因 |
|---|---|
| 接口偶发卡住 | 池队列满、死锁、锁内远程调用 |
OutOfMemoryError: unable to create new native thread | 线程无界创建 |
| 数据偶发错乱 | 共享可变无同步;HashMap 并发写 |
volatile 没用 | 误当成原子性工具 |
处理:有界池 + 明确拒绝策略;共享状态最小化;复合操作要原子方案。
3. Spring / 事务
| 问题 | 常见原因 | 处理 |
|---|---|---|
@Transactional 不生效 | 同类自调用、非 public、异常被吃、没进 Spring 代理 | 注入自身/拆服务方法;抛出让回滚的异常 |
| 事务太大锁表 | 长事务含远程/大循环 | 缩短事务;先落状态再异步 |
| 循环依赖启动失败 | 构造器互环 | 拆模块、Setter/ObjectProvider、或 @Lazy(治标) |
| 注入失败 | 多实现未 @Qualifier、包没被扫描 | 看启动日志 Bean 定义 |
| 配置没生效 | profile 错、配置被覆盖、拼写错 | 启动打印有效配置(注意脱敏) |
事务口诀:代理、异常、边界 三件事先查。
4. Web / 数据 / 缓存
| 问题 | 优先动作 |
|---|---|
| 接口超时 | 看本服务池、DB 池、下游 RT、慢 SQL |
| 慢 SQL | 执行计划、索引、是否 select *、是否 N+1 |
| 更新丢失 | 并发写无版本号/乐观锁;事务隔离误解 |
| 缓存与 DB 不一致 | 先定「谁为准」与失效策略,再谈锁 |
| 缓存击穿/穿透/雪崩 | 空值缓存、互斥重建、过期打散——按真实流量上 |
开放接口再补:鉴权、幂等键、限流、签名校验。
5. 架构与选型
| 问题 | 建议 |
|---|---|
| 要不要上 Cloud? | 发布独立性与团队规模不够 → 先模块化单体 |
| 要不要上 MQ? | 有削峰、异步解耦、最终一致再上;不为「简历有 MQ」 |
| Java 还是 Python? | 状态与业务权威在 Java;模型与脚本在 Python |
| 要不要拆微服务? | 默认否;痛点是独立演进/故障隔离时再拆 |
| 单体已经很乱 | 先划模块与表归属,再谈进程拆分 |
6. 和项目相关的高频坑
AI 异步任务
- 只调通 Demo、没有任务表与状态 → 无法重试与对账
- 重试不幂等 → 重复扣费/重复生成
- 模型错误与网络错误不分类 → 乱重试打爆额度
MES / 多端
- 设备时钟与服务器时钟不一致 → 追溯对不上
- 采集风暴打满连接池 → 业务接口一起挂;要隔离与限流
CRM 定制
- 客户化直接改公共核心 → 升级即冲突;能配置化就配置化
- 大事务里调企业微信/钉钉 → 超时回滚惨案