I have taken a memory dump using adplus and sent the dump file to Microsoft. They provided the following analysis of the dump
From my looking into the dump (not possible to complete .foreach command for gcroot and objsize), you need to look into how NHibernate.Persister.Entity.SingleTableEntityPersister is used.
First this leak is definitely from managed space.
GC Heap Size 0x2c4efbc8(743,373,768)
Here are the big size objects on the heap:
0x7912b8c4 140,095 5,603,800 140,095 System.Reflection.Emit.DynamicResolver
0x79136204 194,216 6,178,776 194,216 System.String[][]
0x04b2ae94 96,149 7,691,920 96,149 NHibernate.Loader.Entity.EntityLoader
0x7911f030 140,107 7,845,992 140,107 System.Reflection.Emit.DynamicMethod
0x04af53ac 24,015 8,837,520 24,015 NHibernate.Persister.Entity.SingleTableEntityPersister
0x7911f400 281,040 8,993,280 281,040 System.Reflection.Emit.SignatureHelper
0x79131d04 548,774 9,266,196 548,774 System.Boolean[]
0x0014bdd8 3,042 9,324,476 3,042 Free
0x7911f538 140,107 14,571,128 140,107 System.Reflection.Emit.DynamicILGenerator
0x79101fe4 333,239 18,661,384 333,239 System.Collections.Hashtable
0x79135538 46,869 36,605,436 46,869 System.Reflection.Emit.__FixupData[]
0x7912d9bc 333,251 60,043,944 333,251 System.Collections.Hashtable+bucket[]
0x7912d7c0 381,770 80,907,508 381,770 System.Int32[]
0x7912dae8 844,624 84,535,652 844,624 System.Byte[]
0x7912d8f8 3,468,457 93,181,316 3,468,457 System.Object[]
0x790fd8c4 2,320,870 205,380,176 2,320,870 System.String
Total 12,822,642 objects, Total size: 743,355,732
However, what is shown in the 3rd size column is the total size of the structures of the objects, not including member variables.
Using .foreach to print out the object size of NHibernate.Persister.Entity.SingleTableEntityPersister, they are all over 2mb, most of them over 4mb:
sizeof(010ecba0) = 2,370,988 ( 0x242dac) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0118b614) = 2,370,988 ( 0x242dac) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0118e1dc) = 2,370,988 ( 0x242dac) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0120ad10) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0121442c) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01217450) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0121b5a0) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01225cec) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01228d10) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0122bd40) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0122ecc4) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01233ec4) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01237fcc) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0123afd8) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0123dfcc) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01240df0) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01244ed0) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01249030) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(0124c04c) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01250130) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01254264) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
sizeof(01257264) = 4,490,236 ( 0x4483fc) bytes (NHibernate.Persister.Entity.SingleTableEntityPersister)
some of them could be cross referenced. They could contain NHibernate.Loader.Entity.EntityLoader, NHibernate.Impl.SessionFactoryImpl and a lot of stirngs:
Name: NHibernate.Persister.Entity.SingleTableEntityPersister
MethodTable: 04af53ac
EEClass: 04b00ae0
Size: 368(0x170) bytes
GC Generation: 2
(D:\SEMIS Server\NHibernate.dll)
Fields:
MT Field Offset Type VT Attr Value Name
79101fe4 400060f 4 ...ections.Hashtable 0 instance 01214bdc typesByPropertyPath
79101fe4 4000610 8 ...ections.Hashtable 0 instance 01214ca4 columnsByPropertyPath
79101fe4 4000611 c ...ections.Hashtable 0 instance 01214d6c formulaTemplatesByPropertyPath
04af5ee0 400061a 10 ...actoryImplementor 0 instance 012080fc factory
041788f4 400061c 14 ...e.Dialect.Dialect 0 instance 01205bd8 dialect
79106894 400061d 18 System.Type 0 instance 0114c6fc mappedClass
7910be50 400061e 134 System.Boolean 1 instance 0 implementsLifecycle
7910be50 400061f 135 System.Boolean 1 instance 0 implementsValidatable
79102290 4000620 128 System.Int32 1 instance 1 batchSize
79110198 4000621 1c ...n.ConstructorInfo 0 instance 0119fed4 constructor
790fd8c4 4000622 20 System.String 0 instance 00000000 sqlWhereString
790fd8c4 4000623 24 System.String 0 instance 00000000 sqlWhereStringTemplate
79106894 4000624 28 System.Type 0 instance 0114c6fc concreteProxyClass
04afce88 4000625 2c ...oxy.IProxyFactory 0 instance 01217010 proxyFactory
7910be50 4000626 136 System.Boolean 1 instance 0 hasEmbeddedIdentifier
7912d8f8 4000627 30 System.Object[] 0 instance 01215644 rootTableKeyColumnNames
7912d8f8 4000628 34 System.Object[] 0 instance 01215658 identifierAliases
79102290 4000629 12c System.Int32 1 instance 1 identifierColumnSpan
04245438 400062a 38 ....Property.ISetter 0 instance 0121561c identifierSetter
04244f30 400062b 3c ....Property.IGetter 0 instance 01215630 identifierGetter
790fd8c4 400062c 40 System.String 0 instance 00000000 versionColumnName
0417afd0 400062d 44 ...Type.IVersionType 0 instance 00000000 versionType
04244f30 400062e 48 ....Property.IGetter 0 instance 00000000 versionGetter
79102290 400062f 130 System.Int32 1 instance 3 hydrateSpan
7912d8f8 4000630 4c System.Object[] 0 instance 01215688 getters
7912d8f8 4000631 50 System.Object[] 0 instance 012156a4 setters
79101fe4 4000632 54 ...ections.Hashtable 0 instance 01214664 gettersByPropertyName
79101fe4 4000633 58 ...ections.Hashtable 0 instance 0121472c settersByPropertyName
04afa6d0 4000634 5c ...ncurrencyStrategy 0 instance 00000000 cache
79101fe4 4000635 60 ...ections.Hashtable 0 instance 012147f4 uniqueKeyLoaders
79101fe4 4000636 64 ...ections.Hashtable 0 instance 012148bc subclassPropertyAliases
79101fe4 4000637 68 ...ections.Hashtable 0 instance 01214984 subclassPropertyColumnNames
79101fe4 4000638 6c ...ections.Hashtable 0 instance 01214a4c lockers
042467e0 4000639 70 ...flectionOptimizer 0 instance 01215a90 optimizer
04afc91c 400063a 74 ...e.EntityMetamodel 0 instance 01214e34 entityMetamodel
7912d7c0 400063b 78 System.Int32[] 0 instance 01215890 propertyColumnSpans
79136204 400063c 7c System.String[][] 0 instance 01215858 propertyColumnNames
79136204 400063d 80 System.String[][] 0 instance 01215874 propertyColumnAliases
79136204 400063e 84 System.String[][] 0 instance 012158a8 propertyColumnFormulaTemplates
006a2f70 400063f 88 System.Boolean[][] 0 instance 012158e0 propertyColumnInsertable
006a2f70 4000640 8c System.Boolean[][] 0 instance 012158c4 propertyColumnUpdateable
79131d04 4000641 90 System.Boolean[] 0 instance 012158fc propertyUniqueness
7910be50 4000642 137 System.Boolean 1 instance 0 hasFormulaProperties
7912d8f8 4000643 94 System.Object[] 0 instance 01216ee4 subclassColumnClosure
7912d8f8 4000644 98 System.Object[] 0 instance 01216f10 subclassFormulaTemplateClosure
7912d8f8 4000645 9c System.Object[] 0 instance 01216f00 subclassFormulaClosure
7912d8f8 4000646 a0 System.Object[] 0 instance 01216f3c subclassColumnAliasClosure
7912d8f8 4000647 a4 System.Object[] 0 instance 01216f58 subclassFormulaAliasClosure
79136204 4000648 a8 System.String[][] 0 instance 01216f94 subclassPropertyFormulaTemplateClosure
79136204 4000649 ac System.String[][] 0 instance 01216fb0 subclassPropertyColumnNameClosure
79131d04 400064a b0 System.Boolean[] 0 instance 01216f84 subclassPropertyNullabilityClosure
7912d8f8 400064b b4 System.Object[] 0 instance 01216f68 subclassPropertyNameClosure
7912d8f8 400064c b8 System.Object[] 0 instance 01216f20 subclassPropertyTypeClosure
0424529c 400064d bc ...rnate.FetchMode[] 0 instance 01216fe8 subclassPropertyFetchModeClosure
04afcf1c 400064e c0 ...Util.FilterHelper 0 instance 0121703c filterHelper
79131d04 400064f c4 System.Boolean[] 0 instance 01217000 propertyDefinedOnSubclass
7912d8f8 4000650 c8 System.Object[] 0 instance 01216fcc subclassPropertyCascadeStyleClosure
79116114 4000651 cc ...tions.IDictionary 0 instance 01214b14 loaders
7912d8f8 4000652 d0 System.Object[] 0 instance 01217284 idAndVersionSqlTypes
7912d8f8 4000653 d4 System.Object[] 0 instance 01217298 idSqlTypes
7912d8f8 4000654 d8 System.Object[] 0 instance 01380050 sqlDeleteStrings
7912d8f8 4000655 dc System.Object[] 0 instance 0138003c sqlInsertStrings
04b2931c 4000656 e0 ...nd.SqlCommandInfo 0 instance 00000000 sqlIdentityInsertString
7912d8f8 4000657 e4 System.Object[] 0 instance 01380064 sqlUpdateStrings
04241b44 4000658 e8 ...Command.SqlString 0 instance 01380398 sqlSnapshotSelectString
04241b44 4000659 ec ...Command.SqlString 0 instance 013803d8 sqlVersionSelectString
04241b44 400065a f0 ...Command.SqlString 0 instance 00000000 sqlInsertGeneratedValuesSelectString
04241b44 400065b f4 ...Command.SqlString 0 instance 00000000 sqlUpdateGeneratedValuesSelectString
79131d04 400065c f8 System.Boolean[] 0 instance 01380418 tableHasColumns
7912d8f8 400065d fc System.Object[] 0 instance 012170c8 customSQLInsert
7912d8f8 400065e 100 System.Object[] 0 instance 012170dc customSQLUpdate
7912d8f8 400065f 104 System.Object[] 0 instance 012170f0 customSQLDelete
79131d04 4000660 108 System.Boolean[] 0 instance 01217104 insertCallable
79131d04 4000661 10c System.Boolean[] 0 instance 01217114 updateCallable
79131d04 4000662 110 System.Boolean[] 0 instance 01217124 deleteCallable
7912d8f8 4000663 114 System.Object[] 0 instance 01217134 insertResultCheckStyles
7912d8f8 4000664 118 System.Object[] 0 instance 01217148 updateResultCheckStyles
7912d8f8 4000665 11c System.Object[] 0 instance 0121715c deleteResultCheckStyles
790fd8c4 4000666 120 System.String 0 instance 00000000 loaderName
04b29c20 4000667 124 ...niqueEntityLoader 0 instance 00000000 queryLoader
7910be50 4000668 138 System.Boolean 1 instance 0 hasSubselectLoadableCollections
00bd6830 400061b 270 log4net.ILog 0 static 0120b0c8 log
790fd8c4 4000686 13c System.String 0 instance 0121706c qualifiedTableName
7912d8f8 4000687 140 System.Object[] 0 instance 012170b4 tableNames
7912d8f8 4000688 144 System.Object[] 0 instance 01217170 subclassClosure
79101fe4 4000689 148 ...ections.Hashtable 0 instance 0121459c subclassesByDiscriminatorValue
7910be50 400068a 139 System.Boolean 1 instance 0 forceDiscriminator
790fd8c4 400068b 14c System.String 0 instance 00000000 discriminatorColumnName
790fd8c4 400068c 150 System.String 0 instance 00000000 discriminatorFormula
790fd8c4 400068d 154 System.String 0 instance 00000000 discriminatorFormulaTemplate
790fd8c4 400068e 158 System.String 0 instance 00000000 discriminatorAlias
041797a8 400068f 15c ...ernate.Type.IType 0 instance 00000000 discriminatorType
790fd8c4 4000690 160 System.String 0 instance 00000000 discriminatorSQLValue
790fd0f0 4000691 164 System.Object 0 instance 00000000 discriminatorValue
7910be50 4000692 13a System.Boolean 1 instance 0 discriminatorInsertable
7912d7c0 4000693 168 System.Int32[] 0 instance 01217184 propertyTableNumbers
790fd0f0 4000694 278 System.Object 0 static 0120ae80 NullDiscriminator
790fd0f0 4000695 27c System.Object 0 static 0120ae8c NotNullDiscriminator
Almost all the objects are pinned together with NHibernate.Loader.Entity.EntityLoader and NHibernate.Impl.SessionFactoryImpl.
DOMAIN(00158230):HANDLE(Pinned):6613b0:Root: 02054fb8(System.Object[])->
010d1bc0(System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[NHibernate.ISessionFactory, NHibernate]])->
08074eb4(System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[NHibernate.ISessionFactory, NHibernate]][])->
012080fc(NHibernate.Impl.SessionFactoryImpl)->
01363a54(System.Collections.Hashtable)->
01363a8c(System.Collections.Hashtable+bucket[])->
0133e0f4(NHibernate.Persister.Entity.SingleTableEntityPersister)
DOMAIN(00158230):HANDLE(Pinned):6613b0:Root: 02054fb8(System.Object[])->
0136632c(System.Collections.Hashtable)->
20cea514(System.Collections.Hashtable+bucket[])->
0e510714(NHibernate.Impl.SessionFactoryImpl)->
0e4f4a40(System.Collections.Hashtable)->
0e4f4a78(System.Collections.Hashtable+bucket[])->
0e5115dc(NHibernate.Persister.Entity.SingleTableEntityPersister)->
0e511cc4(System.Collections.Hashtable)->
0e511cfc(System.Collections.Hashtable+bucket[])->
0e517a20(NHibernate.Loader.Entity.EntityLoader)
We have some domain objects that are static. We dispose of the session but I am wondering whether the static domain objects stop the session from being gargabe collected. Any thoughts? I can foresee some fun over easter.
|