Windbg程序調試系列2-內存泄露問題

上篇文章給你們解釋了Windbg的基本命令和說明,這一篇給你們介紹內存泄露場景的問題分析。服務器

文章大綱:性能

  1. 描述問題背景和現象
  2. 肯定問題是不是內存泄露
  3. 梳理問題分析思路
  4. 動手分析解決
  5. 總結

1. 先說問題背景:生產環境IIS站點,運行一段時間後,w3wp進程內存會漲到2G,同時內存不釋放。3d

2. 問題確認對象

打開性能計數器,咱們重點看一段時間內,IIS站點w3wp進程相關的性能計數器的變化:blog

性能計數器中:有三個很是重要:進程

.NET CLR Memory/Gen 2 heap size
.NET CLR Memory/Gen 1 heap size
.NET CLR Memory/Gen 0 heap size
託管堆上的對象有三代:
第 0 代: 這是最年輕的代,其中包含短生存期對象。 短生存期對象的一個示例是臨時變量。 垃圾回收最常發生在此代中。新分配的對象構成新一代的對象而且爲隱式的第 0 代回收,除非它們是大對象,在這種狀況下,它們將進入第 2 代回收中的大對象堆。大多數對象經過第 0 代中的垃圾回收進行回收,不會保留到下一代。
第 1 代: 這一代包含短生存期對象並用做短生存期對象和長生存期對象之間的緩衝區。
第 2 代: 這一代包含長生存期對象。 長生存期對象的一個示例是服務器應用程序中的一個包含在進程期間處於活動狀態的靜態數據的對象。 當條件獲得知足時,垃圾回收將在特定代上發生。 回收某個代意味着回收此代中的對象及其全部更年輕的代。 第 2 代垃圾回收也稱爲完整垃圾回收FullGC,由於它回收全部代上的全部對象(即,託管堆中的全部對象)。
倖存和提高:垃圾回收中未回收的對象也稱爲倖存者,並會被提高到下一代。 在第 0 代垃圾回收中倖存的對象將被提高到第 1 代;在第 1 代垃圾回收中倖存的對象將被提高到第 2 代;而在第 2 代垃圾回收中倖存的對象將仍爲第 2 代。
經過代提高,看對象的存活時間!內存

Process/Private Bytes
Process/Virtual Bytes
.NET CLR Memory/# Bytes in all Heaps : CLR內存託管堆的大小
.NET CLR Memory/Large Object Heap Size: 大對象堆包含其大小爲 85,000 個字節和更多字節的對象。字符串

託管堆的內存大小增長的趨勢和大對象堆增長的趨勢重疊,能夠初步推斷,內存的增長和大對象有關係!io

3. 梳理問題分析思路變量

連續、間隔抓兩個或者三個Dump,每次抓Dump間隔半個小時,或者一個小時,主要看內存的增量。


對比的看每一個Dump中:

  • 多核CPU狀況下,分析每一個GC託管堆的大小 !eeheap –gc
  • 查詢內存中各種對象的總個數和總內存佔用 !dumpheap –stat
  • 查詢內存中大對象的個數和對象大小 !dumpheap –stat -mt -min 5000 -max 100000
  • 若是某一類或者幾類對象的內存總佔用不少,分析此類對象 !dumpheap –mt ***
  • 屢次採樣查看步驟4中對象的gcroot !gcroot addr
  • 打斷gcroot中任何一個鏈條,釋放對象引用

4. 動手分析

  • 多核CPU狀況下,分析每一個GC託管堆的大小 !eeheap –gc

      

  • 查詢內存中各種對象的總個數和總內存佔用 !dumpheap –stat

      

  • 查詢內存中大對象的個數和對象大小 !dumpheap –stat -mt -min 5000 -max 100000

      

  

  • 若是某一類或者幾類對象的內存總佔用不少,分析此類對象 !dumpheap –mt *** -stat

      

      大對象字符串分析,Session會話數據!同時Session會話中包含了權限數據!

  • 屢次採樣查看步驟4中對象的gcroot !gcroot addr

      

  • 打斷gcroot中任何一個鏈條,釋放對象引用

5. 總結

總結一下,內存泄露問題分析,有固定的方法和指令,過程須要你們深刻理解,同時熟悉代碼很是重要,由於須要找出gcroot,分析出內存泄露的緣由,再進行修改解決。

大的套路:

  • 描述問題背景和現象
  • 肯定問題是不是內存泄露
  • 梳理問題分析思路
  • 動手分析解決
  • 總結

詳細的分析步驟:

  • 多核CPU狀況下,分析每一個GC託管堆的大小 !eeheap –gc
  • 查詢內存中各種對象的總個數和總內存佔用 !dumpheap –stat
  • 查詢內存中大對象的個數和對象大小 !dumpheap –stat -mt -min 5000 -max 100000
  • 若是某一類或者幾類對象的內存總佔用不少,分析此類對象 !dumpheap –mt ***
  • 屢次採樣查看步驟4中對象的gcroot !gcroot addr
  • 打斷gcroot中任何一個鏈條,釋放對象引用

歡迎你們補充。

 

周國慶

2018/10/30

相關文章
相關標籤/搜索