<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ThreadLocal內(nèi)存泄漏分析

          共 9556字,需瀏覽 20分鐘

           ·

          2021-05-16 12:06

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          76套java從入門(mén)到精通實(shí)戰(zhàn)課程分享

          引言

          啥是內(nèi)存泄漏??
          好像一直不明白啥叫內(nèi)存泄漏,對(duì)于java來(lái)說(shuō),就是堆中對(duì)象已經(jīng)不會(huì)再被使用了,但是垃圾收集器卻不能將他們從內(nèi)存中清除。
          關(guān)鍵詞:對(duì)象已經(jīng)不會(huì)再被使用;垃圾收集器不能清除
          垃圾收集器不能清除表示這個(gè)對(duì)象肯定還可達(dá),也就是還有GC root可以到這個(gè)對(duì)象引用鏈。但是這個(gè)對(duì)象對(duì)于我們程序員來(lái)說(shuō)已經(jīng)沒(méi)有用了,也就是我們程序員不會(huì)在使用這個(gè)對(duì)象。對(duì)象已經(jīng)不會(huì)再被使用

          ThreadLocal內(nèi)存泄漏的原因

          啥原因呢?你因該知道ThreadLocal的set是存到當(dāng)前線程對(duì)象的ThreadLocalMap中,當(dāng)棧中對(duì)ThreadLocal對(duì)象的引用釋放后,GC后ThreadLocalMap中的key就指向了null,但是value還是指向你set的對(duì)象。注意對(duì)當(dāng)前線程對(duì)象的引用還在,也就是還有當(dāng)前對(duì)象一直可達(dá),這樣就導(dǎo)致當(dāng)前線程對(duì)象的ThreadLocalMap中的key為null,value不為空。value一直沒(méi)有辦法釋放。

          代碼驗(yàn)證

          package quickstart;

          import java.util.ArrayList;
          import java.util.List;

          public class TestThreadLocalMemoryLeak {
              public static void main(String[] args) {
                  ttt(null);
                  while (true){
                      try{
                          Thread.sleep(1000 * 2);
                      }catch (Exception e){
                          e.printStackTrace();
                      }
                  }
              }
              public static void ttt(String[] args) {
                  Runnable runnable = new Runnable() {
                      @Override
                      public void run() {
                          System.out.println("==================");
                          leak();
                          try{
                              Thread.sleep(1000 * 60);
                          }catch (Exception e){
                              e.printStackTrace();
                          }

                      }

                      private void leak(){
                          List<Double> list = new ArrayList<>();
                          for (int i = 0; i < 10000000; i++) {
                              list.add(Math.random());
                          }

                          ThreadLocal<List> listThreadLocal
                                  = new ThreadLocal<>();
                          listThreadLocal.set(list);
                      }
                  };


                  Thread thread = new Thread(runnable);
                  System.out.println("thread start");
                  thread.start();
                  try{
                      thread.join();
                  }catch (Exception e){
                      e.printStackTrace();
                  }
                  System.out.println("thread end");
              }
          }

          結(jié)果如下圖:在thread死亡之前,點(diǎn)擊“執(zhí)行垃圾回收”按鈕對(duì)堆的大小沒(méi)有作用,當(dāng)線程退出的時(shí)候,GC很快,效果也很明顯。

          你能明白下面的程序?yàn)樯恫粫?huì)構(gòu)成內(nèi)存泄漏嗎?

          package quickstart;

                  import java.util.ArrayList;
                  import java.util.List;

          public class TestThreadLocalMemoryLeak {
              public static void main(String[] args) {
                  ttt(null);

              }
              public static void ttt(String[] args) {
                  Runnable runnable = new Runnable() {
                      @Override
                      public void run() {
                          System.out.println("==================");
                          leak();
                          try{
                              Thread.sleep(1000 * 60);
                          }catch (Exception e){
                              e.printStackTrace();
                          }

                      }

                      private void leak(){
                          List<Double> list = new ArrayList<>();
                          for (int i = 0; i < 10000000; i++) {
                              list.add(Math.random());
                          }

                          ThreadLocal<List> listThreadLocal
                                  = new ThreadLocal<>();
                          listThreadLocal.set(list);
                      }
                  };


                  Thread thread = new Thread(runnable);
                  System.out.println("thread start");
                  thread.start();
                  try{
                      thread.join();
                  }catch (Exception e){
                      e.printStackTrace();
                  }
                  System.out.println("thread end");


                  while (true){
                      try{
                          Thread.sleep(1000 * 2);
                           System.out.println(thread);
                      }catch (Exception e){
                          e.printStackTrace();
                      }
                  }
              }
          }

          因?yàn)闂V幸恢币弥€程。但是線程中的ThreadLocalMap已經(jīng)變成null了。



          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/xiaolixi199311/article/details/116565875





          粉絲福利:Java從入門(mén)到入土學(xué)習(xí)路線圖

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  蜜桃av秘 无码一区二区三 | 亚洲第一伊人 | 草青青在线 | 超碰97国产福利 | 国产精品女人18水真多 |