C# PerfView不可访问内存
我正在研究wcf应用程序的内存问题,我正在使用perfview挖掘内存。我们得到了一个基本快照,然后是内存高时的快照。我对它们进行了区分,并查看了数据,发现未读内存为2921MB。我的理解是,未访问的内存意味着它已经准备好进行GC'd。已经过去16个多小时了,无法到达的记忆还在不断攀升 什么会导致GC不收集无法访问的内存 更新 当服务消耗大量内存时,我能够获得终结器队列的转储。我到底应该在这份报告中寻找什么?或者我应该运行其他windbg/sos/sosex命令C# PerfView不可访问内存,c#,memory-leaks,windbg,perfview,C#,Memory Leaks,Windbg,Perfview,我正在研究wcf应用程序的内存问题,我正在使用perfview挖掘内存。我们得到了一个基本快照,然后是内存高时的快照。我对它们进行了区分,并查看了数据,发现未读内存为2921MB。我的理解是,未访问的内存意味着它已经准备好进行GC'd。已经过去16个多小时了,无法到达的记忆还在不断攀升 什么会导致GC不收集无法访问的内存 更新 当服务消耗大量内存时,我能够获得终结器队列的转储。我到底应该在这份报告中寻找什么?或者我应该运行其他windbg/sos/sosex命令 0:037> !fina
0:037> !finalizequeue
SyncBlocks to be cleaned up: 0
Free-Threaded Interfaces to be released: 0
MTA Interfaces to be released: 0
STA Interfaces to be released: 0
----------------------------------
------------------------------
Heap 0
generation 0 has 464 finalizable objects (0000000033877190->0000000033878010)
generation 1 has 52 finalizable objects (0000000033876ff0->0000000033877190)
generation 2 has 19958 finalizable objects (0000000033850040->0000000033876ff0)
Ready for finalization 228791 objects (0000000033878010->0000000033a36dc8)
------------------------------
Heap 1
generation 0 has 1508 finalizable objects (000000002ee2e168->000000002ee31088)
generation 1 has 91 finalizable objects (000000002ee2de90->000000002ee2e168)
generation 2 has 23498 finalizable objects (000000002ee00040->000000002ee2de90)
Ready for finalization 249421 objects (000000002ee31088->000000002f0182f0)
------------------------------
Heap 2
generation 0 has 66 finalizable objects (00000000292660d0->00000000292662e0)
generation 1 has 63 finalizable objects (0000000029265ed8->00000000292660d0)
generation 2 has 19411 finalizable objects (0000000029240040->0000000029265ed8)
Ready for finalization 238531 objects (00000000292662e0->00000000294380f8)
------------------------------
Heap 3
generation 0 has 510 finalizable objects (0000000034e470d8->0000000034e480c8)
generation 1 has 77 finalizable objects (0000000034e46e70->0000000034e470d8)
generation 2 has 19910 finalizable objects (0000000034e20040->0000000034e46e70)
Ready for finalization 226933 objects (0000000034e480c8->0000000035003470)
Statistics for all finalizable objects (including all objects ready for finalization):
MT Count TotalSize Class Name
000007fe9c64aba8 1 24 System.Threading.OverlappedDataCache
000007fe9af40ea0 1 24 System.Web.Configuration.ImpersonateTokenRef
000007fea03a8640 1 32 System.IO.Compression.ZLibNative+SafeLibraryHandle
000007fe9dd14820 1 32 Microsoft.Win32.SafeHandles.SafeCspHandle
000007fe9d302a50 1 32 Microsoft.Win32.SafeHandles.SafePEFileHandle
000007fe9cf161a8 1 32 Bid+AutoInit
000007fe9cbead60 1 32 Microsoft.Win32.SafeHandles.SafePerfProviderHandle
000007fe9c69a200 1 32 System.Net.SafeLocalFree
000007fe9c649080 1 32 System.ServiceModel.Channels.PipeHandle
000007fe9c62ad18 1 32 System.Net.SafeInternetHandle
000007fe9af42a08 1 32 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
000007fe9af42920 1 32 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
000007fe9ad790b0 1 32 System.Web.PerfInstanceDataHandle
000007fe9c4b08d8 1 40 System.Security.SafeBSTRHandle
000007fe9ce69118 1 48 System.Runtime.CompilerServices.ConditionalWeakTable`2[[System.Transactions.ContextKey, System.Transactions],[System.Transactions.ContextData, System.Transactions]]
000007fe9c62cf68 1 48 System.Runtime.IOThreadScheduler
000007fe9af0d5f8 1 48 Microsoft.CSharp.CSharpCodeProvider
000007fe9ae4c628 1 48 System.Runtime.CompilerServices.ConditionalWeakTable`2[[System.Object, mscorlib],[System.Runtime.Serialization.SerializationInfo, mscorlib]]
000007fe9af43750 1 56 System.Web.Compilation.CompilationMutex
000007fe9ae45a60 2 64 System.Security.Cryptography.SafeProvHandle
000007fe9a91bad0 2 64 System.Threading.TimerQueue+AppDomainTimerSafeHandle
000007fea03adee0 2 96 System.Web.Security.FileSecurityDescriptorWrapper
000007fe9d669608 3 120 System.Threading.RegisteredWaitHandleSafe
000007fe9c623850 3 120 System.Net.SafeRegistryHandle
000007fe9c696808 4 128 System.Gen2GcCallback
000007fe9a97d6b0 4 128 Microsoft.Win32.SafeHandles.SafeFileHandle
000007fe9d8710a0 1 160 System.Threading.CdsSyncEtwBCLProvider
000007fe9c64b368 1 160 System.Collections.Concurrent.CDSCollectionETWBCLProvider
000007fe9c648d08 1 160 System.PinnableBufferCacheEventSource
000007fe9be65a08 5 160 Microsoft.Win32.SafeHandles.SafeProcessHandle
000007fe9f557760 1 168 System.Web.AspNetEventSource
000007fe9acab410 2 176 System.Runtime.Diagnostics.EtwProvider
000007fe9ad7daa0 8 192 System.SizedReference
000007fe9aac5d38 2 208 System.Runtime.Remoting.Contexts.Context
000007fe9e5a7c58 1 216 log4net.Appender.RollingFileAppender
000007fe9c64a138 2 224 System.ServiceModel.Channels.OverlappedContext
000007fe9cbe45c8 3 264 System.Diagnostics.PerformanceData.CounterSet
000007fe9cda2278 9 288 System.Net.SafeCloseHandle
000007fe9c628078 6 288 System.Net.SafeCloseSocketAndEvent
000007fe9ad05090 2 320 System.Diagnostics.Tracing.FrameworkEventSource
000007fe9c4be5a0 2 352 System.Data.DataSet
000007fe9c69ee18 3 360 System.Net.TlsStream
000007fe9a97cf10 4 416 System.IO.FileStream
000007fe9a8afc60 14 448 Microsoft.Win32.SafeHandles.SafeRegistryHandle
000007fe9ad05940 6 528 System.Diagnostics.Tracing.EventSource+OverideEventProvider
000007fe9c714d60 18 576 System.Net.SafeFreeContextBuffer_SECURITY
000007fe9c628d68 19 608 System.Net.SafeNativeOverlapped
000007fe9cbe49d8 14 672 System.Diagnostics.PerformanceData.CounterSetInstanceCounterDataSet
000007fe9ae78550 10 720 System.Web.DirMonCompletion
000007fe9cbe4880 14 784 System.Diagnostics.PerformanceData.CounterSetInstance
000007fe9f2d6db8 12 864 NewRelic.Agent.Core.Wrapper.AsyncAgentWrapperApi.Builders.TransactionBuilder
000007fe9bcb8250 27 864 System.Net.SafeCloseSocket+InnerSafeCloseSocket
000007fe9c6947e0 3 888 System.Net.Connection
000007fe9bcb9d18 28 1120 System.Net.SafeCloseSocket
000007fe9ad7bef8 35 1120 Microsoft.Win32.SafeHandles.SafeWaitHandle
000007fe9c2de460 3 1536 System.Data.DataTable
000007fe9c7dee68 62 2480 System.Net.SafeFreeContextBufferChannelBinding_SECURITY
000007fe9cf19418 12 2592 System.Data.DataColumn
000007fe9bcb6b38 28 3808 System.Net.Sockets.Socket
000007fe9c7196c0 120 3840 System.Security.Cryptography.SafeCertChainHandle
000007fe9c695b60 62 3968 System.Net.Sockets.NetworkStream
000007fe9c711618 62 4960 System.Net.Security._SslStream
000007fe9c718cf8 179 7160 System.Net.SafeCredentialReference
000007fe9c74c9d8 240 7680 System.Security.Cryptography.SafeCertStoreHandle
000007fe9d406ff8 377 9048 System.Reflection.Emit.DynamicResolver+DestroyScout
000007fe9dc33bd0 342 10944 System.Security.Cryptography.SafeKeyHandle
000007fe9cda9d00 25 11400 System.Net.Sockets.SocketAsyncEventArgs
000007fe9f4c7440 532 17024 Devart.Common.o
000007fe9f4e2e90 350 22400 Devart.Data.Oracle.OracleCursor
000007fe9c5e4eb8 651 26040 System.Threading.ThreadPoolWorkQueueThreadLocals
000007fe9f448870 792 31680 Microsoft.Practices.EnterpriseLibrary.Caching.Cache
000007fe9f4c5d40 151 41072 Devart.Data.Oracle.a3
000007fe9f4e0fd8 191 41256 Devart.Data.Oracle.OracleDataReader
000007fe9f3ce7d0 191 44312 Devart.Data.Oracle.OracleCommand
000007fe9c661238 1445 46240 System.Security.Cryptography.SafeHashHandle
000007fe9aaa67e0 1985 47640 System.WeakReference
000007fe9ce69d70 2193 70176 System.Transactions.SafeIUnknown
000007fe9c71c040 2593 82976 System.Security.Cryptography.X509Certificates.SafeCertContextHandle
000007fe9a756f58 1932 123648 System.Threading.ReaderWriterLock
000007fe9c74f038 4788 153216 System.Security.Cryptography.SafeLocalAllocHandle
000007fe9c749bf0 5244 167808 System.Security.Cryptography.SafeCertContextHandle
000007fe9a706568 1942 186432 System.Threading.Thread
000007fe9fcf5df0 1692 243648 Devart.Data.Oracle.dz
000007fe9c71c118 6667 320016 System.Net.SafeFreeCredential_SECURITY
000007fe9a9190e0 15031 360744 System.Threading.TimerHolder
000007fe9be64d58 2328 651840 System.Diagnostics.Process
000007fe9f440548 14217 1023624 Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Storage.ConfigurationChangeFileWatcher
000007fe9ce6a6e8 14217 1364832 System.Timers.Timer
000007fe9c71c918 29980 1678880 System.Net.SafeDeleteContext_SECURITY
000007fe9a94dd68 89958 3598320 Microsoft.Win32.SafeHandles.SafeLocalAllocHandle
000007fe9a91b268 185991 5951712 Microsoft.Win32.SafeHandles.SafeTokenHandle
000007fe9ad0b578 206499 14867928 System.Reflection.Emit.DynamicResolver
000007fe9f3ca188 435920 87184000 Devart.Data.Oracle.OracleConnection
Total 1029284 objects
“准备完成”对象的数量对我来说非常突出。这不应该是零,或者至少少于几百吗?如果您误用了IDisposable,GC将不会收集内存。根据您提供的屏幕截图,您
1.没有关闭到Oracle数据库的连接(我说的是Devart.Data.Oracle…fragment)。不要依赖Oracle DB连接的关闭方法,考虑操作符的使用,这将为您提供确定性垃圾收集。br> 2.第二行提到DynamicResolver,它向我指出了某种依赖注入。根据我的经验,我认为依赖项注入库不知道如何清理对象。这实际上可以通过为DI库使用的类实现IDisposable接口来解决。
三,。第三行有以下子字符串:Win32.SafeHandles.SafeTokenHandle提示您可能使用了一些系统资源,或者使用了.Net世界之外的一些资源,这些资源通常也被命名为非托管资源。对于它们,您还需要实现内存清理和IDisposable,但要与Finalizer结合使用。有关更多详细信息,请参见此 已经过去16个多小时了,无法到达的记忆还在不断攀升。 什么会导致GC不收集无法访问的内存 当任何生成中的对象大小运行特定阈值时,GC将运行。以下是一些近似值:
- 第0代达到256K
- Gen 1命中~2 MB(收集Gen 0和Gen 1)
- 第2代命中~10 MB(收集第0代、第1代和第2代)
- 操作系统发送内存不足通知
- 调用GC.Collect()(除了特殊情况外,这不是一个好主意)
2921MB
,因此下一次收集暂时不会进行。由于GC不是每x秒/分钟/小时等运行一次,所以无论是16小时还是1600小时,它都是根据上述条件运行的
问自己一个更好的问题是,为什么不在Gen 0集合中收集对象。找出在Gen 0中没有收集的对象,然后问问自己:这些对象真的需要在这么长的时间内存在吗
2.9 gb的内存都在gen 2中。我知道GC在Gen2上运行的频率不高,但它似乎在Gen2中使用了近3gb的内存,可以运行并清理它。我认为你的另一点非常好,关于为什么在gen 1中没有收集这些对象。它们没有被收集,因为它们在该点被引用,所以它们进入gen 1,然后进入gen 2。看起来终结器线程已经死锁。启用非托管调试并查看其堆栈跟踪以查看其挂起的位置。我们无法在开发环境中重现此情况。这只发生在prod中。有没有办法获取终结器线程的堆栈跟踪?我将查看windgb,看看它是否能提供更多细节。