标准答案

  1. 线程泄漏看活跃线程、线程栈、创建速率和阻塞堆栈;协程泄漏看未完成任务、事件循环延迟和引用链。
  2. 异步任务泄漏看队列长度、最老任务、取消失败、定时器数量和任务状态长期 running。
  3. 同时观察连接池、文件描述符、内存和 GC,避免把下游堆积误认为单纯线程泄漏。
  4. 修复要确保超时、取消、异常和关闭路径释放资源,并为任务设置生命周期和上限。

题目解析

线程、协程和异步任务泄漏的共同特征是生命周期没有闭合:创建后没有完成、取消、超时或释放。内存不增长并不代表没有泄漏,连接、文件描述符、定时器和队列同样会耗尽。

定位要把资源数量和请求、队列、连接池、GC、线程栈时间线对齐,并比较流量回落后的基线。堆快照只能回答对象是否仍可达,不能单独解释任务和下游连接的泄漏。

修复需要在成功、异常、取消、超时和停机路径都等待任务退出,并设置最大生命周期和上限。重启只能恢复容量,不能替代定位创建路径和未释放引用。

常见误区

  • 误区:只看进程内存判断是否泄漏。改正:同时观察线程、协程、任务、连接、文件描述符和定时器数量。
  • 误区:通过重启掩盖泄漏。改正:记录资源增长曲线、创建调用栈和流量回落后的残留,修复生命周期。
  • 误区:取消任务后立即认为它已经停止。改正:等待取消确认,释放它持有的连接和锁,并处理无法取消的外部调用。

作者信息