2017-02-16 1 views
1

wcf 응용 프로그램에 대한 메모리 문제가 있습니다. perfview를 사용하여 메모리를 파고 들었습니다. 기본 스냅 샷을 얻은 다음 메모리가 많은 시점의 스냅 샷을 얻었습니다. 나는 그들을 diffed하고 2,921 메가 바이트에서 미전도 메모리를 볼 데이터를보고. 내 이해는 미전도 된 메모리가 GC가 될 준비가되었음을 의미합니다. 16 시간이 넘었고 도달 할 수없는 기억이 계속 올라갑니다.PerfView에 연결할 수없는 메모리

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

마무리 자 스레드가 교착 상태 인 것 같습니다. 관리되지 않는 디버깅을 사용하고 스택 추적 위치를 확인하여 스택 위치를 확인합니다. –

+0

우리는 이것을 dev 환경에서 재현 할 수 없습니다. 그것은 단지 찌르다에서 일어나는 일입니다. 파이널 라이저 스레드의 스택 추적을 가져 오는 방법이 있습니까? 더 자세히 설명 할 수 있는지 알아보기 위해 windgb를 살펴 보겠습니다. –

답변

1

IDisposable을 잘못 적용하면 GC에서 메모리를 수집하지 않습니다. 당신이 제공 한 스크린 샷에 따르면,
1. Oracle 데이터베이스에 대한 연결을 닫지 않았습니다 (Devart.Data.Oracle .... 조각에 대해 이야기합니다). 오라클 db 연결의 close 메소드에 의존하는 대신 결정적 가비지 수집을 제공하는 using 연산자의 사용을 고려하십시오.
2. DynamicResolver에 언급 된 두 번째 줄에서는 일종의 의존성 주입을 지적합니다. 내 경험에 비추어 볼 때, 의존성 주입 라이브러리는 객체를 정리하는 방법을 알지 못합니다. DI 라이브러리에서 사용하는 클래스 용 IDisposable 인터페이스를 구현하면 실제로 해결할 수 있습니다. 문자열 다음있다
3. 세 번째 라인은 : Win32.SafeHandles.SafeTokenHandle 아마 당신은 또한 종종 관리되지 않는 리소스를 이름 닷넷 세계 밖에 일부 시스템 자원, 또는 무언가를 사용하여 힌트를 제공합니다. 그들을 위해 Finalizer와 관련하여 메모리 정리 및 IDisposable을 구현해야합니다. 자세한 내용은 link을 참조하십시오.

0

16 시간이 넘었으며 도달 할 수없는 메모리가 계속 올라갑니다. GC가 도달 할 수없는 메모리를 수집하지 못하게하는 원인은 무엇입니까?

세대의 개체 크기가 특정 임계 값을 실행할 때 GC가 실행됩니다. 여기 일부 근사치 :

  • 겐 0 히트 ~ 256 K
  • 겐 ~ 2메가바이트 1 개 히트 (겐 0 겐 1 수집)
  • 2 개 세대 히트 ~ 10메가바이트 (겐 0, 창세기 1, 2 세대는
  • OS는 메모리 부족 알림
  • 하는 GC.Collect()가 호출 (이것은 예외적 인 상황을 제외하고 좋은 생각이 아니다)

귀하의 응용 프로그램,를 전송) 수집 n 메모리는 2,921MB이므로 다음 컬렉션은 잠시 동안 발생하지 않습니다. GC가 매 x 초/분 /시 등을 실행하지 않기 때문에 16 또는 1600 시간이 되었더라도 위의 조건을 기반으로 실행됩니다.

더 나은 질문은 왜 개체가 Gen 0 모음에서 수집되지 않는지 확인하는 것입니다. 어떤 개체가 Gen 0에서 수집되지 않았는지 확인한 다음 자신에게 물어보십시오. 이 개체는 실제로 그 주변에서 필요합니까?.

  1. 필요없는 즉시 개체를 처분해야합니다.
  2. 필요 이상으로 오래 물건을 보관하지 마십시오.
+0

2.9GB의 메모리는 모두 Gen 2에 있습니다. GC가 Gen 2에서는 자주 실행되지 않지만 gen 2에서 사용되는 메모리가 거의 3GB 인 것 같아 실행되고 정리됩니다. 나는 당신의 다른 요점이 왜이 대상이 1 장에서 수집되지 않는지에 관해서 정말로 좋은 것이라고 생각합니다. –

+0

그들은 그 시점에서 참조되어 Gen 1과 Gen 2로 나아 갔기 때문에 수집되지 않았습니다. – CodingYoshi