второе поколение без корней ???
От: .rip  
Дата: 23.02.07 11:06
Оценка:
Есть служба, если вкратце, то она создает шесть потоков, которые с периодичностью в n-ое кол-во секунд вызывают хранимые раклячие процедуры, которые возвращают датасет с данными, которые необходимо обработать. Я собственно не разработчик, а лишь системный аналитик (о, как ), поэтому опишу свои наблюдения. Собственно анализ потребовался по причине "managed memory leaks" данной службы. Обычно через час работы она сваливается с вполне нормальной ошибкой "OutOfMemoryException". Пришлось прибегнуть к ADplus и сделать несколько ханг дампов с разницей во времени около 2 минут. Я на дампы, если честно, очень рассчитывал, НО облом. Далее мои проверки по дампу с помощью windbg:

0:000> .load clr10\sos.dll
0:000> !threads
ThreadCount: 17
UnstartedThread: 0
BackgroundThread: 10
PendingThread: 0
DeadThread: 1
                                  PreEmptive   GC Alloc                     Lock     
        ID  ThreadOBJ       State     GC       Context           Domain     Count APT Exception
  0 0x1708 0x00150ae8        0x20 Enabled  0x00000000:0x00000000 0x0014bb50     0 Ukn
  2   0xc4 0x00159408      0xb220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA (Finalizer)
  3  0x9f4 0x00194858   0x1800220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA (Threadpool Worker)
 10 0x1720 0x002071e8   0x2001220 Enabled  0x00000000:0x00000000 0x0014bb50     0 Ukn
 14  0xafc 0x0022f6b0       0x220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA
 15 0x17ac 0x00230c18       0x220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA
 16 0x1164 0x00232638       0x220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA
 17 0x16d8 0x00233fc8       0x220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA
 18 0x1194 0x00235690       0x220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA
 19 0x1728 0x00235848       0x220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA
 20 0x14a4 0x09361d68       0x220 Enabled  0x00000000:0x00000000 0x0014bb50     0 MTA
 25  0x438 0x09378f38      0x5020 Enabled  0x00000000:0x00000000 0x0014bb50     0 STA
 27  0x128 0x093a2a00      0x1020 Enabled  0x00000000:0x00000000 0x0014bb50     0 Ukn
XXX      0 0x093a7860   0x1800820 Enabled  0x00000000:0x00000000 0x0014bb50     0 Ukn (Threadpool Worker)
 28  0x5ac 0x093e6aa8      0x1020 Disabled 0x1bc2f864:0x1bc2fc50 0x0014bb50     0 Ukn
 29 0x11ac 0x0bff3fb8      0x1020 Enabled  0x1bc31e18:0x1bc33c50 0x0014bb50     0 Ukn
 30 0x1560 0x0c08f640      0x1020 Enabled  0x1bc2fdc0:0x1bc31c50 0x0014bb50     0 Ukn
0:000> !FinalizeQueue
Loaded Son of Strike data table version 5 from "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorwks.dll"
SyncBlock to be cleaned up: 460
----------------------------------
MTA interfaces to be released: 0
Total STA interfaces to be released: 0
----------------------------------
generation 0 has 12 finalizable objects (0x0fa3e014->0x0fa3e044)
generation 1 has 148 finalizable objects (0x0fa3ddc4->0x0fa3e014)
generation 2 has 14,185 finalizable objects (0x0fa30020->0x0fa3ddc4)
Ready for finalization 0 objects (0x0fa3e044->0x0fa3e044) - Freachable queue
All Finalizable Objects Statistics:
        MT      Count     TotalSize Class Name
0x0b3f8978          1            12 System.Data.OleDb.PropertyIDSetWrapper
0x79c0d064          1            20 System.Threading.Mutex
0x79b9802c          1            20 System.Threading.ManualResetEvent
0x79b97e84          1            20 System.Threading.AutoResetEvent
0x79be7d80          2            24 System.Security.Cryptography.RNGCryptoServiceProvider
0x00da5aa0          2            24 System.Data.OleDb.OleDbConnection/OleDbWrapper
0x79bf4a4c          2            48 System.Threading.Timer
0x79bd9a14          1            52 System.IO.StreamWriter
0x79be83cc          1            60 System.Runtime.Remoting.Contexts.Context
0x00da2104          1            68 System.Data.OleDb.OleDbConnection
0x09346d34          2            72 Oracle.DataAccess.Client.ConnectionPool
0x7b369b08          1            92 System.Diagnostics.EventLog
0x0074595c          1            92 ProcessOperationService.ProcessOperationService
0x09346440          6            96 Oracle.DataAccess.Client.MetaData
0x09340d4c          5           100 System.EnterpriseServices.Internal.AppDomainHelper
0x0934d2f0          8           128 Oracle.DataAccess.Types.OpoDecCtx
0x0934a588          3           132 Oracle.DataAccess.Types.OracleRefCursor
0x79bcb2cc          7           196 Microsoft.Win32.RegistryKey
0x7b316f04          4           224 System.Text.RegularExpressions.Regex
0x093484c4          7           420 Oracle.DataAccess.Client.OracleDataAdapter
0x09346200          7           868 Oracle.DataAccess.Client.OracleDataReader
0x79bba72c         15           900 System.Threading.Thread
0x08586834         38         1,824 System.Data.OleDb.NativeDBType
0x79bcbc50        180         2,880 System.WeakReference
0x00da81a8         13         3,016 System.Data.DataTable
0x0858eb28        150        10,200 System.EnterpriseServices.ServicedComponentProxy
0x00da9c28        202        25,856 System.Data.DataColumn
0x09344778      1,057       135,296 Oracle.DataAccess.Client.OracleCommand
0x09349624      1,478       171,448 Oracle.DataAccess.Client.OracleParameter
0x09345538     11,149     1,114,900 Oracle.DataAccess.Client.OracleConnection
Total 14,346 objects, Total size: 1,469,088
0:000> !dumpheap -mt 0x09345538 -l 2
Loaded Son of Strike data table version 5 from "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorwks.dll"
   Address         MT     Size  Gen
0x00e8da4c 0x09345538      100    2 Oracle.DataAccess.Client.OracleConnection 
0x00e8db10 0x09345538      100    2 Oracle.DataAccess.Client.OracleConnection 
total 2 objects
0:000> !dumpobj 0x00e8db10
Name: Oracle.DataAccess.Client.OracleConnection
MethodTable 0x09345538
EEClass 0x0af25098
Size 100(0x64) bytes
GC Generation: 2
mdToken: 0x0200001d  (c:\windows\assembly\gac\oracle.dataaccess\9.2.0.420__89b483f429c47342\oracle.dataaccess.dll)
FieldDesc*: 0x09345058
        MT      Field     Offset                 Type       Attr      Value Name
<skip>
0:000> !gcroot 0x00e8db10
Scan Thread 0 (0x1708)
Scan Thread 2 (0xc4)
Scan Thread 3 (0x9f4)
Scan Thread 10 (0x1720)
Scan Thread 14 (0xafc)
Scan Thread 15 (0x17ac)
Scan Thread 16 (0x1164)
Scan Thread 17 (0x16d8)
Scan Thread 18 (0x1194)
Scan Thread 19 (0x1728)
Scan Thread 20 (0x14a4)
Scan Thread 25 (0x438)
Scan Thread 27 (0x128)
Scan Thread 28 (0x5ac)
Scan Thread 29 (0x11ac)
Scan Thread 30 (0x1560)
Scan HandleTable 0x14aed8
Scan HandleTable 0x14dd50


Т.е. получается корней, делающих объект Oracle.DataAccess.Client.OracleConnection достижимым, вроде как нет. Конечно же сомнения вызывает команда !gcroot, которая ничего не гарантирует. Но тогда каким образом сборщик мусора "видит" референсы на данные объекты? Можно ли "смоделировать" методы мусорщика в windbg? Конечно же, объекты типа Oracle.DataAccess.Client.OracleConnection имеют финализаторы, но всё же непонятно как они с такой легкостью перешли в поколение 2, что их может держать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.