2017-02-16 2 views
1

Я изучаю проблему памяти, которую мы имеем с приложением wcf, и я использую perfview для того, чтобы копаться в памяти. Мы получили базовый снимок, а затем снимок, когда память высока. Я их различал и смотрел на данные, которые я вижу необработанной памятью на 2,921 МБ. Я понимаю, что неохваченная память означает, что она готова быть GC'd. Прошло более 16 часов, и недостижимая память продолжает расти.PerfView unreachable memory

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

enter image description here

UPDATE

Я был в состоянии получить дамп очереди финализатора когда служба потребляет значительную память. Что именно следует искать в этом отчете? Или, может быть, другие команды 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 

Количество объектов «Готово для финализации» выделяется мне. Разве это не должно быть ноль или, по крайней мере, менее нескольких сотен?

+0

Похоже, что резьба финализатора зашла в тупик. Включите неуправляемую отладку и посмотрите на ее трассировку стека, чтобы увидеть, где она висит. –

+0

Мы не можем воспроизвести это в среде dev. Это происходит только в prod. Есть ли способ получить трассировку стека финализатора? Я посмотрю на windgb, чтобы узнать, может ли он дать более подробную информацию. –

ответ

1

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

0

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

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

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

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

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

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

2.9 ГБ памяти - все в гене 2. Я знаю, что GC не работает так часто в гене 2, но похоже, что почти 3 гб памяти, используемой в гене 2, запускается и очищает его. Я думаю, что ваш другой момент действительно хорош, о том, почему этот объект не собирается в gen 1. –

+0

Они не собираются, потому что на них ссылаются в этот момент, поэтому они пробиваются к Gen 1, а затем Gen 2. – CodingYoshi