ThreadLocal 與記憶體洩漏
【Q】為什麼不能使用強引用?
先看看使用強引用會出現什麼問題。
ThreadLocalMap 中,value 作為一個本地變數,應該不會說總在使用,因此用完之後最好清理這個 Entry。
如果執行緒執行很快,執行緒退出後 ThreadLocalMap 不存在了自然不用再管其內部屬性了;但如果是長時間存在的執行緒,在併發量大的情況下,每個執行緒都持有一個無用物件無法回收,造成記憶體洩漏。(當然可以手動回收)
ThreadLocalMap 使用弱引用的 key 是一個很大的進步,能夠在 set 與 get 的過程中檢測到無效的 key,從而清理連續段中包含無效 key 的 Entry。
但這種清理工作並不是每次都及時的,對於長時間執行的執行緒,如果 key 引用的物件被回收之後,不再呼叫 set 與 get 方法,那麼 value 物件就一直不會清理,將造成記憶體洩漏。
解決辦法就是用完之後呼叫 remove 方法進行清理。
PS:如果 ThreadLocal 物件是 static 型別,弱引用將形同虛設,類似於上述強引用的問題,可以手動回收。
相關推薦
ThreadLocal 與記憶體洩漏
【Q】為什麼不能使用強引用? 先看看使用強引用會出現什麼問題。 ThreadLocalMap 中,value 作為一個本地變數,應該不會說總在使用,因此用完之後最好清理這個 Entry。 如果執行緒執行很快,執行緒退出後 ThreadLocalMap 不存在了自然不用再管其內部屬性了;但如果是長時間存在的執
分析ThreadLocal的弱引用與記憶體洩漏問題
目錄 一.介紹 二.問題提出 2.1記憶體原理圖 2.2幾個問題 三.回答問題 3.1為什麼會出現記憶體洩漏 3.2若Entry使用弱引用 3.3弱引用配合自動回收 四.總結 一.介紹 之前使用ThreadLocal的時候,就聽過Threa
【達內課程】Android中的GC垃圾回收機制與記憶體洩漏
當main()方法執行完,main()方法中的區域性變數都會彈棧,從棧當中銷燬 當左側棧中的e2和e銷燬後,右側中的兩個物件就是垃圾 java底層有一種GC垃圾回收機制,在java程式執行時,GC執行緒會不斷找尋垃圾,是的話會清除掉 當我們點選模擬機的返回鍵時,發生了什麼 當G
Java定時任務Timer排程器【三】 注意事項(任務精確性與記憶體洩漏)
一、任務精確性 通過前兩節的分析,大概知道了Timer的執行原理,下面說說使用Timer需要注意的一些事項。下面是Timer簡單原理圖 從上圖可以看到,真正執行鬧鐘的是一個單執行緒。也就是說佇列中的鬧鐘,只能依次進行序列化的操作,鬧鐘的定時執行得不到保證。 比如下面的例子(本節所有
高併發和ThreadLocal以及記憶體洩漏
併發程式設計 首先感謝https://blog.csdn.net/iter_zc/article/details/39546405這個系列的作者。之前接觸過高併發,但是都是在斷斷續續的接觸和學習,沒有一個結構化的學習。我的博文就是在看了他的講解之後自己理解的。如果我寫的不夠好,大家可以去
淺談 Android 記憶體溢位與記憶體洩漏
概念 記憶體溢位(Out of memory):系統會給每個APP分配記憶體,預設16M記憶體,每個手機廠商的預設值不一樣,當APP所需要的記憶體大於了系統分配的記憶體,就會造成記憶體溢位;記憶體溢位就是分配的記憶體被用光了,不夠用了。 記憶體洩漏(Memo
Java的記憶體溢位與記憶體洩漏
記憶體溢位是啥?記憶體洩漏是啥?它們兩個有關係嗎?讓我們帶著上面的問題來看本篇文章 ·························································································
ThreadLocal的記憶體洩漏問題
在最近一個專案中,在專案釋出之後,發現系統中有記憶體洩漏問題。表象是堆記憶體隨著系統的執行時間緩慢增長,一直沒有辦法通過gc來回收,最終於導致堆記憶體耗盡,記憶體溢位。開始是懷疑ThreadLocal的問題,因為在專案中,大量使用了執行緒的ThreadLocal儲存執行緒上下文資訊,在正常情況下,線上程開
Android gc與記憶體洩漏,溢位的理解
GC介紹 在java中垃圾回收是自動釋放的,不像c/c++需要手動釋放,手動釋放可能處理不當, 會造成記憶體洩漏與資料混亂等等影響。 GC常用的回收演算法 1,計數 引用計數是垃圾收集器中的早期策略
通過GC日誌分析程式效能與記憶體洩漏
摘自 : http://blog.csdn.net/huangzhaoyang2009/article/details/11860757 JVM的GC日誌的主要引數包括如下幾個: -XX:+PrintGC 輸出GC日誌 -XX:+PrintGCDetails 輸出G
關於ThreadLocal引起記憶體洩漏的理解
ThreadLocal 的作用是提供執行緒內的區域性變數,這種變數線上程的生命週期內起作用,減少同一個執行緒內多個函式或者元件之間一些公共變數的傳遞的複雜度。但是如果濫用 ThreadLocal,就可能會導致記憶體洩漏。下面,我們將圍繞三個方面來分析 ThreadLo
Android開發:淺談MVP模式應用與記憶體洩漏
最近博主開始在專案中實踐MVP模式,卻意外發現記憶體洩漏比較嚴重,但卻很少人談到這個問題,促使了本文的釋出,本文假設讀者已瞭解MVP架構。 MVP簡介 M-Modle,資料,邏輯操作層,資料獲取,資料持久化儲存。比如網路操作,資料庫操作 V-Vie
Java記憶體溢位與記憶體洩漏
記憶體溢位:記憶體溢位就是指在指定大小的記憶體空間,寫入了超出大小的資料(越界).或者沒有足夠的記憶體,供程式分配。 記憶體洩漏:程式在執行過程中動態申請的記憶體空間不再使用後沒有及時釋放,從而很可能導致應用程式記憶體無線增長。更廣義的記憶體洩露包括未對系統的資源的及時釋放
JavaScript的垃圾回收機制與記憶體洩漏
常用的兩種演算法: 引用計數(新版瀏覽器已棄用,棄用原因:會出現迴圈引用的情況,無法進行垃圾回收,導致記憶體洩漏) 標記清除 引用計數法 引用計數,顧名思義一個物件是否有指向它的引用,即看棧中是否有指向要釋放的該塊堆記憶體中的地址,如果沒有,則該塊記憶體是不需要的,可以進行釋放,即垃圾回收 下面引用大佬的一個
Chrome 瀏覽器垃圾回收機制與記憶體洩漏分析
Chorme 瀏覽器中的垃圾回收和記憶體洩漏 垃圾回收 通常情況下,垃圾資料回收分為手動回收和自動回收兩種策略。 手動回收策略,何時分配記憶體、何時銷燬記憶體都是由程式碼控制的。 自動回收策略,產生的垃圾資料是由垃圾回收器來釋放的,並不需要手動通過程式碼來釋放。 JavaScript 中呼叫棧中的資料回收 J
threadlocal與ThreadPoolExecutor造成的記憶體洩漏
threadlocal與執行緒相關,每個執行緒都會有一份,參考 http://python.jobbole.com/86150/ ThreadPoolExecutor建構函式裡面有max_workers引數,如果這個引數設定的不好,就有可能造成記憶體洩漏。 示例程式碼如
ThreadLocal原理、使用場景及存在記憶體洩漏的原因
什麼是執行緒封閉 當多執行緒訪問共享變數時,往往需要加鎖來保證共享變數的執行緒安全(資料同步)。一種避免使用加鎖方式就是不共享資料,而是讓執行緒獨享資料。由於資料本身就是執行緒私有的,這樣,如果僅在單執行緒內訪問資料就不需要同步,這種避免共享資料的技術稱為執行緒封閉。在Java語言中,提供了一些
android防記憶體洩漏與記憶體優化的方法整理
記憶體洩漏 一、單利洩漏 存在記憶體洩露問題的一些程式碼片段像下面這樣: public class Util { private Context mContext;  
ThreadLocal記憶體洩漏
前言 ThreadLocal 的作用是提供執行緒內的區域性變數,這種變數線上程的生命週期內起作用,減少同一個執行緒內多個函式或者元件之間一些公共變數的傳遞的複雜度。但是如果濫用ThreadLocal,就可能會導致記憶體洩漏。下面,我們將圍繞三個方面來分析ThreadLocal 
Android記憶體洩漏與記憶體溢位
Android記憶體洩漏與記憶體溢位 記憶體洩漏 什麼是記憶體洩漏 記憶體洩漏的原因 記憶體洩漏檢測工具LeakCanary Java中的記憶體分配 Java中的四種引用型別 騰訊記憶體洩漏分析