有意思的ThreadLocal內存泄露

寫完這篇我再也不用CSDN了

接近007的工作制度讓我沒有自己的時間做自己的事。更別提自己建個博客網站了。。。唉。

正文

天吶,在這家公司寫CRUD寫的我都忘了ThreadLocal實現原理了(DougLea是不是要氣死)。
今天好不容易有個假期,來複習一下吧。
這個例子沒測試過,我是隨便寫了個示範供自己記憶。


public class ThreadLocalMemoryLeak {

    private static final ThreadLocal<byte[]> THREAD_LOCAL = ThreadLocal.withInitial(() -> new byte[1024 * 1024 * 1024]);

    public static void main(String[] args) throws InterruptedException {
        //java.lang.ThreadLocal的實現是在Thread.currentThread()對象裏建立一個Map賦值到Thread.threadLocals字段。
        //其中K是THREAD_LOCAL的地址,V是THREAD_LOCAL.get()的值
        //K是弱引用但V不是,所以即便THREAD_LOCAL對象已經被GC回收,Thread對象裏的threadLocals裏K所對應的V也不會被回收
        //另外順便提一嘴,ThreadLocal.ThreadLocalMap的實現類似HashMap,解決hash衝突用的尋址法,所以ThreadLocal多的情況可能會很慢,推薦使用Netty實現的fastthreadlocal
        for (int i = 0; i < 500; i++) {
            new Thread(THREAD_LOCAL::get).start();
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章