PerfView недоступная память

Я смотрю на проблему с памятью, которую мы имеем с приложением wcf, и я использую perfview, чтобы копаться в памяти. Мы получили базовый снимок, а затем снимок, когда памяти много. Я просмотрел их и, глядя на данные, увидел, что объем свободной памяти составляет 2921 МБ. Насколько я понимаю, что недостигнутая память означает, что она готова к сборке. Прошло более 16 часов, а недостижимая память продолжает расти.

Что заставило бы GC не собирать недоступную память?

введите описание изображения здесь

ОБНОВИТЬ

Мне удалось получить дамп очереди финализатора, когда служба потребляет значительную память. Что именно я должен искать в этом отчете? Или другие команды windbg / sos / sosex, которые я должен запустить?

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

Количество объектов "Готово к доработке" выделяется мне. Разве это не должно быть ноль или хотя бы меньше нескольких сотен?

2 ответа

GC не будет собирать память, если вы неправильно используете IDisposable. Согласно скриншоту, который вы предоставили, вы
1. не закрывал соединение с базой данных Oracle (я говорю о Devart.Data.Oracle.... фрагмент). Вместо того, чтобы полагаться на закрытый метод соединения oracle db, рассмотрите использование оператора using, который обеспечит вам детерминированную сборку мусора.
2. Вторая строка, в которой упоминается DynamicResolver, указывает на какое-то внедрение зависимости. Из моего опыта я предполагаю, что ваша библиотека внедрения зависимостей не знает, как чистить ваши объекты. Это на самом деле решаемо с помощью реализации интерфейса IDisposable для ваших классов, которые используются вашей библиотекой DI.
3. Третья строка, которая имеет следующие подстроки: Win32.SafeHandles.SafeTokenHandle дает подсказку, что, вероятно, вы используете некоторые системные ресурсы, или что-то за пределами.Net мира, который также часто называют неуправляемые ресурсы. Для них вам нужно реализовать очистку памяти и IDisposable, а также в связи с Finalizer. Смотрите эту ссылку для более подробной информации.

Прошло более 16 часов, а недостижимая память продолжает расти. Что заставило бы GC не собирать недоступную память?

GC будет работать, когда размер объектов любого поколения будет иметь определенный порог. Вот некоторые приблизительные значения:

  • Бит 0 хитов ~256 К
  • Gen 1 хиты ~ 2 МБ (Gen 0 и Gen 1 собраны)
  • Gen 2 хиты ~ 10 МБ (Gen 0, Gen 1 и Gen 2 собраны)
  • ОС отправляет уведомление о нехватке памяти
  • GC.Collect() вызывается (это не очень хорошая идея, за исключением исключительных обстоятельств)

Память вашего приложения находится на 2,921MB поэтому следующая коллекция не произойдет какое-то время. Неважно, прошло ли это 16 или 1600 часов, поскольку ГХ работает не каждые х сек / мин / час и т. Д., Но он работает на основе вышеуказанных условий.

Лучше задать себе вопрос - понять, почему объекты НЕ собираются в коллекции Gen 0. Узнайте, какие объекты не собраны в Gen 0, а затем спросите себя: действительно ли эти объекты нужны вокруг так долго?,

  1. Убедитесь, что вы избавляетесь от предметов, как только они не нужны.
  2. Не держите предметы дольше, чем они должны быть.
Другие вопросы по тегам