[英]Memory fragmentation?
我不確定,因為我在分析內存轉儲方面沒有太多經驗,但我認為我們可能會遇到內存碎片問題。
在負載測試期間,我們看到內存使用量正在增長到應用程序重新啟動的程度。 它是64位機器上的ASP.NET MVC 4應用程序。 我沒有參與寫作。 我被要求嘗試分析內存轉儲。
因此,在上次加載測試期間,我們創建了3個內存轉儲(低於它們的大小和來自eeheap -gc的總GC堆大小輸出):
因此,您看到托管堆的增長速度不如轉儲文件。 當我執行dumpheap -stat時,我發現Free對象使用了大部分空間(下面是每個轉儲文件)
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.