## 集合无界增长（Medium）

### 触发信号

- 全局/静态 Map/List/Set/Dict 只有 `put`/`add`/`set`/`push` 而无 `remove`/`delete`/`evict`
- 缓存实现无大小上限（无 max size、max entries、max memory 配置）
- 日志/历史记录集合只追加不清理
- 以对象为 key 的 Map/Set（对象引用无法被 GC 回收）

### 判定流程

1. **识别增长型集合**：`find_references` 追踪全局/静态/类成员级别的集合变量，检查是否有删除操作：
   - `Grep` 搜索集合变量的 `delete`/`remove`/`clear`/`evict` 调用
   - 只有 `set`/`add`/`push`/`put` → 可能无界增长
2. **检查增长速率**：`Read` 确认写入频率：
   - 每次请求写入 → 高风险（快速增长）
   - 仅启动时/配置变更时写入 → 低风险
3. **检查淘汰策略**：`Read` 确认是否有：
   - 大小上限（`if (cache.size > MAX) { cache.clear() }`）
   - TTL/过期清理（`setTimeout` 定期清理、LRU 策略）
   - 使用 LRU/TTL 库（`lru-cache`、`Guava Cache`、`TTLMap`）
4. **检查对象 key 引用**：`Read` 确认 Map/Set 的 key 是否为对象引用（非原始类型），对象引用作为 key 会阻止 GC 回收

### 证据构造

确认缺陷后，输出需包含：
- 集合声明位置和类型（含文件:行号）
- 写入路径和频率（从哪些调用路径写入，多频繁）
- 缺失的淘汰机制（无大小上限、无 TTL、无清理）
- 业务影响（内存持续增长、长时间运行后 OOM）

### 排除

- 已有 LRU/TTL/大小限制的缓存实现
- 启动时一次性加载的只读集合
- 短生命周期集合（请求级、函数局部变量）
- 有定时清理任务的集合（`setInterval` 定期 `clear`）
