ThreadLocal 面試翻車現場

  1. 啥是弱引用?
    就是一個對象是弱引用時,System.gc()會直接回收掉這個地方,強引用的話,則GC不會回收掉,例以下面的Demo中,第二次weak.get()返回值是null,由於他是弱引用
public static void main(String[] args) {
        String abc=new String("abc");
        WeakReference<String> weak=new WeakReference<String>(abc);
        System.out.println("print:" +weak.get());
        abc=null;
        System.gc();

        System.out.println("print:" +weak.get());
        
    }
  1. 弱引用有什麼好處?
    強引用的對象GC的要求嚴格,必須沒有引用的狀況下才能夠回收(GC Roots不可達),Java設計了一種短暫生命週期的對象,弱引用對象,只在建立和FGC以前有效,FGC以後,無論有沒有繼續引用,都直接釋放內存的一種機制。
    幫助更好的管理內存。面試

  2. ThreadLocal中 弱引用的使用架構

  • 每一個Thread類都有一個ThreadLocalMap
  • 每一個ThreadLocalMap裏面都有一個 Entry[] table
  • 每一個Entry就是一個鍵值對, key 就是ThreadLocal並且是弱引用的,Value是普通對象,強引用
    重點注意:Entry不是弱引用,只有key是弱引用,而value是強引用
  1. ThreadLocal 和OOM
    問題來了,若是一個線程不停的給不一樣thradLocal屬性設置值,而且該線程長期不結束,那麼這些threadLocal對象會在fgc的時候被GC掉,可是value值並不會被GC掉,由於是線程.ThreadLocalMap.Entry.value 在強引用,因此這些value值,既不能被訪問到(key已經被回收了),又沒法被回收,並且全部引用了這個ThreadLocal的線程裏,都有這個現象。因此容易形成OOM學習

  2. ThreadLocal和線程池
    線程池裏面的ThreadLocal會出錯嗎?
    會的,因此新任務啓動的時候,要init,把全部threadlocal屬性都置爲null線程

以爲不錯請點贊支持,歡迎留言或進個人我的羣855801563領取【架構資料專題目合集90期】、【BATJTMD大廠JAVA面試真題1000+】,本羣專用於學習交流技術、分享面試機會,拒絕廣告,我也會在羣內不按期答題、探討。設計

相關文章
相關標籤/搜索