场景说明
审计全项目 java.util.Timer 使用,发现 3 处每实例/每缓存项创建原生 Timer 线程,且覆盖、删除、清理时均不 cancel,长时间运行会累积线程直至 unable to create native thread。
发现的问题
1. NodeViewJavaScriptCacheContext
每次 cache() 新建 Timer;同 key 覆盖、save/remove/delete 不 cancel,线程存活至 15 分钟缓存过期。
2. MockInstance + MockInstanceFactory
每实例一个 Timer(每秒检查过期);仅过期时自 cancel,外部 clear(/cleanMock)不 cancel,线程存活至 15 分钟自动过期。
3. DelayTaskManager
每任务一个 Timer(单次调度,执行后自动结束,问题较轻)。
期望实现
统一替换为共享 daemon ScheduledExecutorService(单线程调度),覆盖/删除/关闭时 cancel,消除线程泄漏。
验证场景
- 全项目无 Timer 残留
- 模块全量 178 测试通过
- 全项目 clean install 通过
场景说明
审计全项目 java.util.Timer 使用,发现 3 处每实例/每缓存项创建原生 Timer 线程,且覆盖、删除、清理时均不 cancel,长时间运行会累积线程直至 unable to create native thread。
发现的问题
1. NodeViewJavaScriptCacheContext
每次 cache() 新建 Timer;同 key 覆盖、save/remove/delete 不 cancel,线程存活至 15 分钟缓存过期。
2. MockInstance + MockInstanceFactory
每实例一个 Timer(每秒检查过期);仅过期时自 cancel,外部 clear(/cleanMock)不 cancel,线程存活至 15 分钟自动过期。
3. DelayTaskManager
每任务一个 Timer(单次调度,执行后自动结束,问题较轻)。
期望实现
统一替换为共享 daemon ScheduledExecutorService(单线程调度),覆盖/删除/关闭时 cancel,消除线程泄漏。
验证场景