These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: nhibernate and memory usage
PostPosted: Sun Mar 02, 2008 1:09 am 
Newbie

Joined: Mon Jul 16, 2007 2:25 am
Posts: 7
Hi

Our project is developing a windows applications that invokes services from an application server. On the application server, services and group by domain. Each domain has its own cached session factory. During our testing we have noticed the memory consumption of the windows service that hosts the services was increasing. We took a memory dump with adplus and investigated the GC Gen 2 memory heap. We observed a large number of string objects. 20% to 30% of memory load was consumed by rooted strings. Most of the strings appeared to be rooted to the EntityLoader which in turn is rooted to the cached session factory. An example of this is

0:000> !do 1e32caa4
Name: System.String
MethodTable: 790fd8c4
EEClass: 790fd824
Size: 104(0x68) bytes
(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: Party.TelephoneServiceTypeCode telephones0_
Fields:
MT Field Offset Type VT Attr Value Name
79102290 4000096 4 System.Int32 0 instance 44 m_arrayLength
79102290 4000097 8 System.Int32 0 instance 43 m_stringLength
790ff328 4000098 c System.Char 0 instance 50 m_firstChar
790fd8c4 4000099 10 System.String 0 shared static Empty
>> Domain:Value 00155270:790d884c <<
7912dd40 400009a 14 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 00155270:00fd1458 <<
0:000> !gcroot 1e32caa4
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 0 OSTHread 2f4
Scan Thread 2 OSTHread 59c
Scan Thread 3 OSTHread 1450
Scan Thread 5 OSTHread 614
Scan Thread 10 OSTHread 50c
Scan Thread 15 OSTHread 1188
Scan Thread 17 OSTHread 116c
Scan Thread 18 OSTHread 14a4
Scan Thread 19 OSTHread 1240
Scan Thread 20 OSTHread 11bc
Scan Thread 26 OSTHread 12a4
Scan Thread 27 OSTHread 1244
Scan Thread 28 OSTHread 1728
Scan Thread 29 OSTHread 15d0
DOMAIN(00155270):HANDLE(Pinned):6613c0:Root:01fd8170(System.Object[])->
012e033c(System.Collections.Hashtable)->
22d9079c(System.Collections.Hashtable+bucket[])->
1e1bc620(NHibernate.Impl.SessionFactoryImpl)->
1e2c53c8(System.Collections.Hashtable)->
1e2c5400(System.Collections.Hashtable+bucket[])->
1e299ce4(NHibernate.Persister.Entity.SingleTableEntityPersister)->
1e29a33c(System.Collections.Hashtable)->
1e29a374(System.Collections.Hashtable+bucket[])->
1e32c67c(NHibernate.Loader.Entity.EntityLoader)->
1e32cb0c(NHibernate.SqlCommand.SqlString)->
1e32cb1c(System.Object[])->
1e32caa4(System.String)

my expection is that the strings should be garbage collected once a session is closed. Is this assumption correct or am I not doing something correctly?

Cheers
Peter



Our code that uses a session follows the pattern
Code:
            using (NHibernate.ISession session = NHibernateSessionManager.Instance.GetSession<User>(_appSession))
            {
                ICriteria criteria = session.CreateCriteria(typeof(User));
                criteria.Add(NHibernate.Expression.Expression.In("Id", userIds));
                users = new Users(criteria.List<User>());
            }



Hibernate version: 1.2.1.4000 with .Net 2.0

Code between sessionFactory.openSession() and session.close():

Code:
private static Dictionary<string, ISessionFactory> _sessionFactories = new Dictionary<string, ISessionFactory>();

private static object _sessionLock = new object();

private ISessionFactory GetDomainSessionFactory(string domainNameSpace)
        {
            if (string.IsNullOrEmpty(domainNameSpace))
            {
                throw new ArgumentNullException("sessionFactoryConfigPath may not be null nor empty");
            }

            if (_sessionFactories.ContainsKey(domainNameSpace) == false)
            {
                lock (_sessionLock)
                {
                    if (_sessionFactories.ContainsKey(domainNameSpace) == false)
                    {
                        NHibernate.Cfg.Configuration cfg = GetConfiguration(domainNameSpace);
                       
                        ISessionFactory nextFactory = null;
                        if (IsMmappingLoaded(cfg.ClassMappings, domainNameSpace))
                            nextFactory = cfg.BuildSessionFactory();
                        else
                            nextFactory = cfg.AddAssembly(domainNameSpace).BuildSessionFactory();

                        if (nextFactory == null)
                        {
                            throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
                        }

                        _sessionFactories.Add(domainNameSpace, nextFactory);
                    }
                }
            }

            ISessionFactory sessionFactory = _sessionFactories[domainNameSpace];

            return sessionFactory;
        }

public static NHibernate.Cfg.Configuration GetConfiguration(string domainNameSpace)
        {
            string defaultSchema = ConfigurationHelper.GetDefaultSchemaString(domainNameSpace);
            string connectionString = ConfigurationHelper.GetConnectionString(domainNameSpace);
            NHibernate.Cfg.Configuration nHibernateConfig = new NHibernate.Cfg.Configuration();
            nHibernateConfig.SetProperty("hibernate.connection.provider", "NHibernate.Connection.DriverConnectionProvider");
            nHibernateConfig.SetProperty("hibernate.dialect", "NHibernate.Dialect.MsSql2005Dialect");
            nHibernateConfig.SetProperty("hibernate.connection.driver_class", "NHibernate.Driver.SqlClientDriver");
            nHibernateConfig.SetProperty("hibernate.connection.isolation", "ReadCommitted");
            nHibernateConfig.SetProperty("hibernate.default_schema", defaultSchema);
            nHibernateConfig.SetProperty("hibernate.connection.connection_string", connectionString);
            nHibernateConfig.AddAssembly("GrantEd.Common.DomainModel");
            nHibernateConfig.AddAssembly("GrantEd.Common.DomainModel.Code");

            return nHibernateConfig;
        }

[/code]


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 20, 2008 12:19 am 
Newbie

Joined: Mon Jul 16, 2007 2:25 am
Posts: 7
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.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 20, 2008 10:41 am 
Regular
Regular

Joined: Wed Aug 15, 2007 7:37 am
Posts: 73
I only looked over this briefly but do you know how many session factories get created in that dictionary? If there are a lot, and you're never getting rid of them, that could be the cause. Good luck...


Top
 Profile  
 
 Post subject: Same problem
PostPosted: Sat Mar 22, 2008 6:03 am 
Newbie

Joined: Sun Jun 10, 2007 5:32 pm
Posts: 8
Location: Gothenburg
Hi!

I have posted about the same issue here:

http://forum.hibernate.org/viewtopic.php?t=983883

A unit test in NUnit that reproduces the problem is enclosed.

BR // Peter


Top
 Profile  
 
 Post subject:
PostPosted: Tue Apr 08, 2008 9:55 pm 
Newbie

Joined: Mon Jul 16, 2007 2:25 am
Posts: 7
Steve doubled check that the dictionary was correctly creating session factories, one per domain.

While checking this, I found code that was not disposing the session factory created outside of project's pattern for establishing and displosing of a session. Once I closed the session factory, everything was sweet.


Cheers
Peter


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.