У меня большой многомодульный проект Maven с тысячами тестов.Каждый тест загружает DAO, сервисы и т. Д. С помощью аннотации SpringApplicationContext.Моя конфигурация unitils выглядит следующим образом:
database.driverClassName=org.hsqldb.jdbcDriver
database.url=jdbc:hsqldb:file:mytestdb
database.schemaNames=PUBLIC
database.userName=sa
database.password=
database.dialect=hsqldb
unitils.modules=database,dbunit,hibernate,inject,spring
# custom version of HsqldbDbSupport which calls "SET REFERENTIAL_INTEGRITY FALSE"
org.unitils.core.dbsupport.DbSupport.implClassName.hsqldb=my.company.unitils.HsqldbDbSupport
org.dbunit.dataset.datatype.IDataTypeFactory.implClassName.hsqldb=org.dbunit.ext.hsqldb.HsqldbDataTypeFactory
org.unitils.dbmaintainer.structure.ConstraintsDisabler.implClassName=org.unitils.dbmaintainer.structure.impl.DefaultConstraintsDisabler
# custom version of CleanInsertLoadStrategy which calls "DatabaseUnitils.disableConstraints();"
DbUnitModule.DataSet.loadStrategy.default=my.company.unitils.DataSetLoadStrategy
HibernateModule.configuration.implClassName=org.hibernate.cfg.AnnotationConfiguration
dbMaintainer.disableConstraints.enabled=true
dbMaintainer.cleanDb.enabled=true
dbMaintainer.generateDataSetStructure.enabled=false
dataSetStructureGenerator.xsd.dirName=target/xsd
dbMaintainer.autoCreateExecutedScriptsTable=true
updateDataBaseSchema.enabled=false
dbMaintainer.fromScratchEnabled=true
Моя конфигурация Hibernate выглядит следующим образом:
hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.format_sql=false
hibernate.dialect=org.hibernate.dialect.HSQLDialect
hibernate.connection.autocommit=false
hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
hibernate.cache.use_query_cache=false
hibernate.cache.use_second_level_cache=false
hibernate.cache.use_structured_entries=false
hibernate.generate_statistics=false
Когда я запускаю тесты, 2 ГБ, выделенные для кучи, в конечном итоге заполняются.Пермген достигает около 400 МБ.Если посмотреть на дамп кучи, char , java.lang.String и java.lang.String [] занимают около 40% от общего числа экземпляров.
Когда я проверяю несколько таких экземпляров, корень GC прослеживает до:
- диспетчера контекста Spring (в форме извлечения XML контекста)
- SessionFactory (в форме запросов)
Я хотел бы оптимизировать эти 2 вещи, и я думаю, они соответственно вызваны:
- Каждый тест имеет аннотацию @SpringApplicationContext
- Каждый тест также использует аннотацию unitils @DataSet для загрузки данных для этого теста.
Примечание. Я использую файл jdbc: hsqldb: fileвыгрузить некоторые данные из кучи (т.е. вместо использования jdbc: hsqldb: mem)
Версии:
hsqldb 1.8.0.7
Spring 3.0.4.RELEASE
unitils 3.1
PS Может кто-нибудь с рейтингом 1500+, пожалуйста, пометьте этот вопрос "unitils"?