国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記一次 .NET某管理局檢測(cè)系統(tǒng) 內(nèi)存暴漲分析

這篇具有很好參考價(jià)值的文章主要介紹了記一次 .NET某管理局檢測(cè)系統(tǒng) 內(nèi)存暴漲分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一:背景

1. 講故事

前些天有位朋友微信找到我,說(shuō)他們的WPF程序有內(nèi)存泄漏的情況,讓我?guī)兔聪略趺椿厥拢坎⑶襠ump也抓到了,網(wǎng)上關(guān)于程序內(nèi)存泄漏,內(nèi)存暴漲的文章不計(jì)其數(shù),看樣子這個(gè)dump不是很好分析,不管怎么說(shuō),上 windbg 說(shuō)話。

二:WinDbg分析

1. 內(nèi)存真的暴漲嗎

.NET調(diào)試訓(xùn)練營(yíng)中我一直強(qiáng)調(diào)要相信數(shù)據(jù),不要相信別人的一面之詞,往往會(huì)把你帶到溝里去,接下來(lái)使用 !address -summary 觀察下提交內(nèi)存。


0:000> !address -summary

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                    586     7dfd`f04e3000 ( 125.992 TB)           98.43%
<unknown>                              1390      201`5a9bc000 (   2.005 TB)  99.86%    1.57%
Heap                                   3989        0`7695c000 (   1.853 GB)   0.09%    0.00%
Image                                  1744        0`2077d000 ( 519.488 MB)   0.02%    0.00%
Stack                                   957        0`1dc00000 ( 476.000 MB)   0.02%    0.00%
TEB                                     319        0`0027e000 (   2.492 MB)   0.00%    0.00%
Other                                    61        0`001f9000 (   1.973 MB)   0.00%    0.00%
PEB                                       1        0`00001000 (   4.000 kB)   0.00%    0.00%
...
--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                586     7dfd`f04e3000 ( 125.992 TB)           98.43%
MEM_RESERVE                            2028      201`46def000 (   2.005 TB)  99.85%    1.57%
MEM_COMMIT                             6433        0`c8d1e000 (   3.138 GB)   0.15%    0.00%
...

從卦中可知當(dāng)前的提交內(nèi)存是 3.1G,對(duì)于一個(gè)窗體程序來(lái)說(shuō)這個(gè)內(nèi)存量算是比較大了,接下來(lái)使用 !eeheap -gc 觀察下托管堆內(nèi)存。


0:000> !eeheap -gc

========================================
Number of GC Heaps: 1
----------------------------------------
generation 0 starts at 1b368e4de10
generation 1 starts at 1b3687ea4f0
generation 2 starts at 1b300001000
ephemeral segment allocation context: none
Small object heap
         segment            begin        allocated        committed allocated size         committed size        
    01b300000000     01b300001000     01b30fffff88     01b310000000 0xfffef88 (268431240)  0x10000000 (268435456)
    01b35dc70000     01b35dc71000     01b368e8fe28     01b369995000 0xb21ee28 (186773032)  0xbd25000 (198332416) 
Large object heap starts at 1b310001000
         segment            begin        allocated        committed allocated size         committed size        
    01b310000000     01b310001000     01b316d40560     01b316d41000 0x6d3f560 (114554208)  0x6d41000 (114561024) 
    01b3cfc50000     01b3cfc51000     01b3d6588320     01b3d6589000 0x6937320 (110326560)  0x6939000 (110333952) 
Pinned object heap starts at 1b318001000
         segment            begin        allocated        committed allocated size         committed size        
    01b318000000     01b318001000     01b3180812d0     01b318082000 0x802d0 (525008)       0x82000 (532480)      
------------------------------
GC Allocated Heap Size:    Size: 0x28914900 (680610048) bytes.
GC Committed Heap Size:    Size: 0x29421000 (692195328) bytes.

從卦中數(shù)據(jù)看,當(dāng)前的托管堆也才 692M,和當(dāng)前的 3G 相差甚遠(yuǎn),這就說(shuō)明這個(gè)程序出現(xiàn)了比較麻煩的 非托管內(nèi)存泄漏,接下來(lái)回頭看下內(nèi)存地址段發(fā)現(xiàn) Heap=1.8G ,有了這個(gè)數(shù)據(jù)后用 !heap -s 觀察下地址段。


0:000> !heap -s


************************************************************************************************************************
                                              NT HEAP STATS BELOW
************************************************************************************************************************
LFH Key                   : 0x3861e2c156213079
Termination on corruption : ENABLED
          Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                            (k)     (k)    (k)     (k) length      blocks cont. heap 
-------------------------------------------------------------------------------------
000001b37a6b0000 00000002  194824 183768 194432  29846  1716    20   30   6fa1   LFH
    External fragmentation  16 % (1716 free blocks)
000001b37a4e0000 00008000      64      8     64      6     1     1    0      0      
000001b37c140000 00001002    3516   2492   3124    476    69     3    0      0   LFH
    External fragmentation  19 % (69 free blocks)
000001b37c380000 00001002      60     36     60      8     3     1    0      0      
000001b37c360000 00041002      60      8     60      5     1     1    0      0      
000001b37d510000 00001002    1472     88   1080     38     7     2    0      0   LFH
000001b320a10000 00001002    1472    204   1080     71    12     2    0      0   LFH
000001b327a60000 00001002     452     32     60      4     3     1    0      0   LFH
000001b3292b0000 00001002 1513284 1215876 1512892  74984  6445   924    4 2e72c3   LFH
    Virtual address fragmentation  19 % (924 uncommited ranges)
    Lock contention  3044035 
000001b327e80000 00001002    1472    812   1080    439    11     2    0      2   LFH
000001b327cb0000 00001002    3516   1140   3124    519    12     3    0      0   LFH
    External fragmentation  45 % (12 free blocks)
000001b327ec0000 00001002    1472    824   1080    468    10     2    0      0   LFH
000001b327cc0000 00001002    1472   1012   1080    441    11     2    0      0   LFH
-------------------------------------------------------------------------------------

從卦中數(shù)據(jù)看當(dāng)前的內(nèi)存都被 Heap=000001b3292b0000 這個(gè)私有heap給吃掉了,看樣子是某個(gè)程序?yàn)榱四硞€(gè)目的單獨(dú)分配的,由于沒(méi)有開(kāi)啟 ust ,這里就沒(méi)法進(jìn)行下去了,接下來(lái)陷入了迷茫。

2. 在絕望中尋找希望

沒(méi)有開(kāi)啟ust是不是就沒(méi)有突破口了呢?大多情況下是的,但作為調(diào)試師,需要具備在 絕望中尋找希望 的能力,再回頭看地址段,發(fā)現(xiàn) TEB=319,也就說(shuō)當(dāng)前程序有 319 個(gè)線程,對(duì)于一個(gè)窗體程序來(lái)說(shuō)這么多線程很明顯是一個(gè)異常信號(hào),那這個(gè)就是突破口,先用 !tp 觀察下托管線程列表。

從卦中數(shù)據(jù)看基本都是線程池的工作線程,為什么會(huì)開(kāi)啟這么多線程呢?第一個(gè)反應(yīng)就是線程是不是卡住了?馬上用 !syncblk 命令做下驗(yàn)證。


0:000> !syncblk
Index         SyncBlock MonitorHeld Recursion Owning Thread Info          SyncBlock Owner
 2363 000001B3984D6928          381         1 000001B335581A80 607c 135   000001b35e3a0d98 System.Object
-----------------------------
Total           2410
CCW             301
RCW             126
ComClassFactory 1
Free            1783

我去。。。卦中的數(shù)據(jù)又讓我看到了希望!原來(lái)有190 個(gè)線程卡在 System.Object 鎖上,趕緊找個(gè)線程觀察下線程棧,為了隱私我就多隱藏一點(diǎn)。


0:263> ~~[5a2c]s
ntdll!NtWaitForMultipleObjects+0x14:
00007fff`c800fec4 c3              ret
0:292> !clrstack
OS Thread Id: 0x5a2c (292)
        Child SP               IP Call Site
0000002E98DFEB48 00007fffc800fec4 [HelperMethodFrame_1OBJ: 0000002e98dfeb48] System.Threading.Monitor.ReliableEnter(System.Object, Boolean ByRef)
0000002E98DFECA0 00007fff12dd2ca3 xxx.SqliteHelper.Insert[[System.__Canon, System.Private.CoreLib]](System.__Canon, System.String ByRef)
...
0000002E98DFF220 00007fff136902b6 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread)
0000002E98DFF2D0 00007fff12d1a12b System.Threading.ThreadPoolWorkQueue.Dispatch()
0000002E98DFF360 00007fff136de091 System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart()
0000002E98DFF6B0 00007fff7115aed3 [DebuggerU2MCatchHandlerFrame: 0000002e98dff6b0] 

從卦中可以看到當(dāng)前卡在 SqliteHelper.Insert 方法上,這到底是何方神圣?趕緊看一下代碼。

Task.Run 去跑一個(gè)異步邏輯,是一個(gè)編程大坑,一旦這個(gè) Task.Run 運(yùn)行比較慢或者前端請(qǐng)求比較大,很容易造成線程饑餓,從這個(gè)程序中的 SetBlob 方法來(lái)看,就是將 byte[] 丟到 SqlLite 里,所以這個(gè)非托管內(nèi)存泄漏其實(shí)是 Sqlite 在非托管層持有的數(shù)據(jù)。

挖到了根子上的原因之后,解決辦法就比較簡(jiǎn)單了。

  1. 盡量的批量化Insert,不要用 foreach 一條一條的 Insert
  2. 用單獨(dú)線程隊(duì)列化處理,不要用偷懶式 Task.Run

三:總結(jié)

這次分析之旅是典型的 在絕望中尋找希望,調(diào)試者需要具備沉著冷靜的心態(tài),堅(jiān)持不放棄最終在 內(nèi)存段 的 TEB 上找到了尋找真相的突破口。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-844130.html

記一次 .NET某管理局檢測(cè)系統(tǒng) 內(nèi)存暴漲分析

到了這里,關(guān)于記一次 .NET某管理局檢測(cè)系統(tǒng) 內(nèi)存暴漲分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 記一次 .NET 某埋線管理系統(tǒng) 崩潰分析

    記一次 .NET 某埋線管理系統(tǒng) 崩潰分析

    經(jīng)常有朋友跟我反饋,說(shuō)看你的文章就像看天書(shū)一樣,有沒(méi)有一些簡(jiǎn)單入手的dump 讓我們先找找感覺(jué),哈哈,今天就給大家?guī)?lái)一篇入門級(jí)的案例,這里的入門是從 WinDbg 的角度來(lái)闡述的,這個(gè)問(wèn)題如果你通過(guò) 記日志,分析代碼 的方式,可能真的無(wú)法解決,不信的話繼續(xù)往下

    2024年02月11日
    瀏覽(23)
  • 記一次 .NET 某藥材管理系統(tǒng) 卡死分析

    記一次 .NET 某藥材管理系統(tǒng) 卡死分析

    前段時(shí)間有位朋友找到我,說(shuō)他們?cè)诓樵儓?bào)表的時(shí)候發(fā)現(xiàn)程序的穩(wěn)定性會(huì)受到影響,但服務(wù)器的內(nèi)存,CPU都是正常的,讓我?guī)兔聪略趺椿厥?,?wèn)了下程序的穩(wěn)定性指的是什么?指的是卡死,那既然是卡死,就抓一個(gè)卡死的dump吧。 不同的程序類型分析卡死的思路是不一樣的

    2024年02月09日
    瀏覽(30)
  • 記一次 .NET 某零售管理系統(tǒng) 存儲(chǔ)不足分析

    記一次 .NET 某零售管理系統(tǒng) 存儲(chǔ)不足分析

    前幾天有位朋友找到我,說(shuō)他的程序會(huì)偶發(fā)性的報(bào) 存儲(chǔ)空間不足,無(wú)法處理此命令 的錯(cuò)誤,讓我?guī)兔聪碌降自趺椿厥?,哈哈,人家是有備而?lái),dump都準(zhǔn)備好了,話不多說(shuō),直接分析開(kāi)干。 一般來(lái)講別人說(shuō)的只是一個(gè)參考,我們需要自己到dump中去驗(yàn)證,可以用 !t 觀察下。

    2024年02月05日
    瀏覽(23)
  • 記一次 .NET某防偽驗(yàn)證系統(tǒng) 崩潰分析

    記一次 .NET某防偽驗(yàn)證系統(tǒng) 崩潰分析

    昨晚給訓(xùn)練營(yíng)里面的一位朋友分析了一個(gè)程序崩潰的故障,因?yàn)榭葱』镒幼蛱煸谌豪飭?wèn)了一天也沒(méi)搞定,干脆自己親自上陣吧,抓取的dump也是我極力推薦的用 procdump 注冊(cè) AEDebug 的方式,省去了很多溝通成本。 windbg有一個(gè)非常強(qiáng)大的點(diǎn)就是當(dāng)你雙擊打開(kāi)后,會(huì)自動(dòng)幫你切換到

    2024年03月28日
    瀏覽(26)
  • 記一次 .NET 某企業(yè)采購(gòu)平臺(tái) 崩潰分析

    記一次 .NET 某企業(yè)采購(gòu)平臺(tái) 崩潰分析

    前段時(shí)間有個(gè)朋友找到我,說(shuō)他們的程序有偶發(fā)崩潰的情況,讓我?guī)兔聪略趺椿厥?,針?duì)這種 crash 的程序,用 AEDebug 的方式抓取一個(gè)便知,有了 dump 之后接下來(lái)就可以分析了。 既然是程序的崩潰,我們可以像看藍(lán)屏一下看dump文件,使用 !analyze -v 命令即可。 從上面的信息

    2024年02月11日
    瀏覽(24)
  • 記一次 .NET 某企業(yè)內(nèi)部系統(tǒng) 崩潰分析

    記一次 .NET 某企業(yè)內(nèi)部系統(tǒng) 崩潰分析

    前些天有位朋友找到我,說(shuō)他的程序跑著跑著就崩潰了,讓我看下怎么回事,其實(shí)沒(méi)怎么回事,抓它的 crash dump 就好,具體怎么抓也是被問(wèn)到的一個(gè)高頻問(wèn)題,這里再補(bǔ)一下鏈接: [.NET程序崩潰了怎么抓 Dump ? 我總結(jié)了三種方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月10日
    瀏覽(22)
  • 記一次 .NET 某券商論壇系統(tǒng) 卡死分析

    記一次 .NET 某券商論壇系統(tǒng) 卡死分析

    前幾個(gè)月有位朋友找到我,說(shuō)他們的的web程序沒(méi)有響應(yīng)了,而且監(jiān)控發(fā)現(xiàn)線程數(shù)特別高,內(nèi)存也特別大,讓我?guī)兔匆幌略趺椿厥拢F(xiàn)在回過(guò)頭來(lái)幾經(jīng)波折,回味價(jià)值太濃了。 這個(gè)程序內(nèi)存高,線程高,無(wú)響應(yīng),尼瑪是一個(gè)復(fù)合態(tài)問(wèn)題,那怎么入手呢?按經(jīng)驗(yàn)推測(cè),大概率是

    2024年02月05日
    瀏覽(32)
  • 記一次 .NET 某醫(yī)院門診軟件 卡死分析

    記一次 .NET 某醫(yī)院門診軟件 卡死分析

    前幾天有位朋友找到我,說(shuō)他們的軟件在客戶那邊卡死了,讓我?guī)兔聪率窃趺椿厥??我就讓朋友在程序卡死的時(shí)候通過(guò) 任務(wù)管理器 抓一個(gè) dump 下來(lái),雖然默認(rèn)抓的是 wow64 ,不過(guò)用 soswow64.dll 轉(zhuǎn)還是可以的,參考命令如下: 接下來(lái)就可以分析了哈。 首先用 !t 簡(jiǎn)單看一下主

    2024年02月04日
    瀏覽(19)
  • 記一次 .NET某賬本軟件 非托管泄露分析

    記一次 .NET某賬本軟件 非托管泄露分析

    中秋國(guó)慶長(zhǎng)假結(jié)束,哈哈,在老家拍了很多的短視頻,有興趣的可以上B站觀看:https://space.bilibili.com/409524162 ,今天繼續(xù)給大家分享各種奇奇怪怪的.NET生產(chǎn)事故,希望能幫助大家在未來(lái)的編程之路上少踩坑。 話不多說(shuō),這篇看一個(gè) .NET程序集泄露 導(dǎo)致的CLR私有堆泄露的案例,

    2024年02月08日
    瀏覽(26)
  • 記一次 .NET 某電力系統(tǒng) 內(nèi)存暴漲分析

    記一次 .NET 某電力系統(tǒng) 內(nèi)存暴漲分析

    前些天有位朋友找到我,說(shuō)他生產(chǎn)上的程序有內(nèi)存暴漲情況,讓我?guī)兔聪略趺椿厥?,最?jiǎn)單粗暴的方法就是讓朋友在內(nèi)存暴漲的時(shí)候抓一個(gè)dump下來(lái),看一看大概就知道咋回事了。 這個(gè)問(wèn)題說(shuō)的再多也不為過(guò),一定要看清楚這個(gè)程序是如何個(gè)性化發(fā)展的,可以使用 !address

    2024年02月08日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包