乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      記一次排查線上程序內(nèi)存的忽高忽低,又是大集合惹禍了

       python_lover 2021-03-30

      一:背景

      1. 講故事

      昨天繼續(xù)還技術(shù)債,優(yōu)化一輪后的程序拉到線上后內(nèi)存繼續(xù)忽高忽低,低的時候20G,高的時候30G,過了一會又下降了幾個G,毫無疑問,程序中有什么集合或者什么操作占用了大量內(nèi)存,所以準(zhǔn)備在28,29G的時候抓dump分析分析。

      二:解決思路

      從快照中找問題就像看病一樣,根據(jù)病象推測,都有一套經(jīng)驗(yàn)可循。

      1. 把托管堆中>10M的對象找出來

      通常應(yīng)對大集合從托管堆入手最簡單,看哪個類型占用空間大,基本就是它出問題了,為了避免把所有類型都打出來,這里設(shè)置一下過濾,把小于10M都踢掉, 可以用 !dumpheap -stat -min 10240,把敏感對象脫敏掉。

      
      0:000> !dumpheap -stat -min 10240
      Statistics:
                    MT    Count    TotalSize Class Name
      00007ffe094e6fc0        4       523776 System.Object[]
      00007ffe094e6948        6      7179822 System.String
      00007ffe0780da08       33     46514160 System.Collections.Generic.Dictionary`2+Entry[[System.Int32, mscorlib],[System.Collections.Generic.HashSet`1[[System.Int32, mscorlib]], System.Core]][]
      00007ffe09f95f40      250    188739344 System.Collections.Generic.Dictionary`2+Entry[[System.Int32, mscorlib],[System.Int32, mscorlib]][]
      00007ffe094ec988       18    540828823 System.Byte[]
      00007ffe07802da8     1620    622578672 System.Linq.Set`1+Slot[[System.Int32, mscorlib]][]
      000001bc0452e600     1389   1038494910      Free
      00007ffe094baf50       68   1128274800 System.Collections.Generic.Dictionary`2+Entry[[System.Int32, mscorlib],[System.DateTime, mscorlib]][]
      00007ffe094e9220     2224   1513951832 System.Int32[]
      00007ffe07819df8     2232   1668042480 System.Collections.Generic.HashSet`1+Slot[[System.Int32, mscorlib]][]
      00007ffe094c8510      226   1672164568 System.Int64[]
      00007ffdab8676e8     1137   1901228880 System.Collections.Generic.HashSet`1+Slot[[System.Int64, mscorlib]][]
      00007ffdab89b3b0      136   1986723840 System.Linq.Set`1+Slot[[System.Int64, mscorlib]][]
      Total 13321 objects
      
      

      2. 找出堆中可疑的對象

      因?yàn)槌绦騿雍笞鳛閮?nèi)存數(shù)據(jù)庫,所以有包含指定類的大集合對象很正常,倒數(shù)第7行有一個Dictionary<int,Datetime> 占用空間挺大的,1128274800/1024/1024=1G,這個貌似不是基礎(chǔ)數(shù)據(jù),應(yīng)該是中間變量,方法表地址為00007ffe094baf50, 通過它可以找到這68個集合的內(nèi)存地址。

      
      0:028> !dumpheap -mt 00007ffe094baf50
               Address               MT     Size   
      000001c2f262a708 00007ffe094baf50 69438000     
      000001c1bb8e1020 00007ffe094baf50 16147872     
      000001c1bce04760 00007ffe094baf50 33486336     
      000001c37e8f1020 00007ffe094baf50 143987328     
      000001c44e8f1020 00007ffe094baf50 287974800    
      000001c3c419b268 00007ffe094baf50 16147872   
      000001c3f6b9ac28 00007ffe094baf50 16147872     
      000001c467336fa0 00007ffe094baf50 33486336     
      000001c46f3fa760 00007ffe094baf50 69438000   
      000001c489df3668 00007ffe094baf50 16147872     
      000001c494166828 00007ffe094baf50 33486336     
      000001c4a68f1020 00007ffe094baf50 69438000  
      000001c4d4c5c290 00007ffe094baf50 16147872     
      000001c4da8f1058 00007ffe094baf50 33486336     
      000001c4de8f1020 00007ffe094baf50 69438000
      000001c5028f1058 00007ffe094baf50 33486336     
      000001c5068f1020 00007ffe094baf50 33486336
      ...
      
      

      下一步挑幾個大的 Dictionary 看看,比如這一行: 000001c44e8f1020 00007ffe094baf50 287974800,計(jì)算一下size:279M。

      3. 尋找集合所在的代碼塊

      字典占用279M我是知道了,但怎么知道這個字典是在哪一個代碼塊呢? 要尋找答案也容易,通過!gcroot 找到它的引用根,通過引用鏈就可以找到它的代碼區(qū)塊,簡直不要太實(shí)用,

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多