內存泄漏
程序中已動態分配的堆內存,由于某種原因程序為釋放和無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。內存泄漏的堆積終將導致內存溢出。
內存溢出
沒有足夠的內存提供申請者使用。
ThreadLocal出現內存泄漏的真實原因
內存泄漏的發生跟ThreadLocalMap中的key是否使用弱引用是沒有關系的。
內存泄漏發生的真正原因是:
1.沒有手動刪除這個Entry。只要在使用完ThreadLocal,調用其remove方法刪除對應的Entry,就能避免內存泄漏。
2.CurrentThread依然運行。由于ThreadLocalMap是Thread的一個屬性,被當前線程所引用,所以它的生命周期跟Thread一樣長。那么在使用完ThreadLocal的使用,如果當前Thread也隨之執行結束,ThreadLocalMap自然也會被gc回收,從根源上避免了內存泄漏。
綜上:ThreadLocal內存泄漏的根源是,由于ThreadLocalMap的生命周期跟Thread一樣長,如果沒有手動刪除對應key就會導致內存泄漏。
避免內存泄漏有兩種辦法
1.使用完ThreadLocal,調用其remove方法刪除對應的Entry。
2.使用完ThreadLocal,當前Thread也隨之運行結束。
相對于第一種方式,第二種方式顯然更不好控制,特別是使用線程池的時候,線程結束時不會銷毀的。
所以,