Threadlocal是否存在内存泄露

Threadlocal 是否存在内存泄露,需要解决以下的疑惑:

1. ThreadLocal.ThreadLocalMap 中提到的弱引用,弱引用究竟会不会被回收?

2. 弱引用什么情况下回收?

3. JAVA 的 ThreadLocal 和在什么情况下会内存泄露?

最近看到网上的一篇文章,分析说明 ThreadLoca l是如何内存泄露的。代码例子普遍是这样子的:

public class Test {
    public static void main(String[] args) throws InterruptedException {
        ThreadLocal tl = new MyThreadLocal();
        tl.set(new My50MB());
         
        tl=null;
         
        System.out.println("Full GC");
        System.gc();
    }
     
    public static class MyThreadLocal extends ThreadLocal {
        private byte[] a = new byte[1024*1024*1];
         
        @Override
        public void finalize() {
            System.out.println("My threadlocal 1 MB finalized.");
        }
    }
     
    public static class My50MB {
        private byte[] a = new byte[1024*1024*50];
         
        @Override
        public void finalize() {
            System.out.println("My 50 MB finalized.");
        }
    } 
}

输出结果:

Full GC
My threadlocal 1 MB finalized.

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。