簡體   English   中英

內存碎片?

[英]Memory fragmentation?

我不確定,因為我在分析內存轉儲方面沒有太多經驗,但我認為我們可能會遇到內存碎片問題。

在負載測試期間,我們看到內存使用量正在增長到應用程序重新啟動的程度。 它是64位機器上的ASP.NET MVC 4應用程序。 我沒有參與寫作。 我被要求嘗試分析內存轉儲。

因此,在上次加載測試期間,我們創建了3個內存轉儲(低於它們的大小和來自eeheap -gc的總GC堆大小輸出):

  1. 1.70GB,292MB
  2. 2.03GB,337MB
  3. 2.55GB,347MB

因此,您看到托管堆的增長速度不如轉儲文件。 當我執行dumpheap -stat時,我發現Free對象使用了大部分空間(下面是每個轉儲文件)

  1. 147MB
  2. 145MB
  3. 213MB
Fragmented blocks larger than 0.5 MB:
            Addr     Size      Followed by
000000bcc668e0a8    0.7MB 000000bcc6738650 System.Object[]
000000bcc6949f88    4.4MB 000000bcc6dab820 System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
000000bd4626c4b8    0.7MB 000000bd463165f8 System.Byte[]
000000bd463fcc48   51.5MB 000000bd4977baf0 System.Threading.ThreadStart
000000be463600c8    0.7MB 000000be464108f0 Free
000000bec67e50e0    1.1MB 000000bec690b020 System.Collections.Generic.List`1[[OurType, ANotherOurType]]
000000bec690b0b8    3.2MB 000000bec6c3b170 System.Byte[]
000000bfc6605e00    1.0MB 000000bfc6710190 Free
000000bfc6743c58   32.8MB 000000bfc8806fe8 System.Threading.ExecutionContext
000000c046200580    1.0MB 000000c0462ff2a0 SomeOurType
000000c0463a1270    3.6MB 000000c046732ac0 Microsoft.Win32.SafeHandles.SafeCapiKeyHandle

根據我的理解,當Free對象只是所有堆大小的總內存量的一小部分時,這不是問題。 這看起來像是一個問題。

App正在使用兩個外部庫。 一個用於創建PDF-s和其他用於創建條形碼文件。 條形碼庫拋出了AccessViolationException(2200次嘗試大約70次)。 它拋出了這個堆棧跟蹤

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Drawing.SafeNativeMethods.Gdip.IntGdipDeleteGraphics(HandleRef graphics)
   at System.Drawing.Graphics.Dispose(Boolean disposing)
   at System.Drawing.Graphics.Dispose()
   at Lesnikowski.Barcode.BaseBarcode.Render()
   at Lesnikowski.Barcode.BaseBarcode.Save(Stream stream, ImageType imageType)

我已經讀過內存碎片通常是由固定內存引起的,但這是!gchandles輸出

Handles:
    Strong Handles:       154
    Pinned Handles:       23
    Ref Count Handles:    2
    Weak Long Handles:    1794
    Weak Short Handles:   74
    SizedRef Handles:     17
    Dependent Handles:    1

我不知道還能檢查什么。 我們有內存碎片問題嗎? 你能指點我嗎?

編輯:我附加在負載測試期間收集的性能計數器。 奇怪,因為它顯示了很多固定的對象但是!gchandles沒有顯示它們。

在此輸入圖像描述

red line   - user load
green line - bytes in all heaps
blue line  - pinned objects

Edit2:添加大於0.5 MB的碎片塊:從!dumpheap -stat輸出

您應該使用!address -summary來了解此過程中的虛擬內存使用情況。 盡管似乎存在一些堆碎片,但在您的過程中很可能會有一些額外的大量內存使用者。 它可能是Win32堆,它可能是線程堆棧,它可能是您正在動態加載的程序集,依此類推。

對於每種類型的泄漏,您必須遵循稍微不同的方法。 對於Win32堆檢查,您應該使用!heap命令的變體 - !heap -stat!heap -s -h 0 對於程序集加載問題,您應該使用!eeheap -loader查看加載程序堆,然后檢查您使用的各種AppDomain !dumpdomain以查看要加載的程序集。 這些只是一些例子 - 您必須提供有關您的情況的更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM