Continuation泄漏检测:虚拟线程的资源管理
深入虚拟线程的Continuation机制,分析ThreadLocal泄漏与固定线程池导致的Continuation残留,使用JFR事件定位。 · 难度:入门 · +10XP
Continuation泄漏:虚拟线程的隐藏杀手
每个虚拟线程对应一个Continuation对象(栈帧快照)。如果任务未正确结束(如无限循环或ThreadLocal引用),Continuation无法被GC,导致元空间泄漏。本课通过jcmd和JFR的jdk.VirtualThreadEnd事件,分析泄漏的根因。同时演示如何使用StructuredTaskScope代替ExecutorService自动清理上下文,以及使用ScopedValue替代ThreadLocal避免引用链。
// 泄漏场景:虚拟线程持有外部引用
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
for (int i = 0; i < 100_000; i++) {
executor.submit(() -> {
ThreadLocal<byte[]> local = new ThreadLocal<>();
local.set(new byte[1024 * 1024]); // 1MB
try { Thread.sleep(Long.MAX_VALUE); } catch (InterruptedException e) {}
});
}
// 大量Continuation无法释放,最终OutOfMemoryError