OutOfMemoryError: se trata de optimizar Maven pruebas de unidad de módulos múltiples utilizando HSQLDB, DBUnit, unitils, Hibernate, Spring

StackOverflow https://stackoverflow.com/questions/3788174

Pregunta

Tengo un proyecto Maven multi-módulo grande con miles de pruebas. Cada una de las cargas de prueba DAOs, servicios, etc utilizando la anotación SpringApplicationContext. Mis unitils configuración parece ser la siguiente:

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

Mi Hibernate miradas de configuración como esta:

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

Cuando funciono las pruebas, la de 2 GB asigna para montón finalmente se llena. PermGen alcanza aproximadamente 400 MB. Mirando el volcado del montón, Char , java.lang.String y java.lang.String [] ocupa aproximadamente 40% del total instancias.

Cuando inspección al azar algunos de estos casos, las huellas de raíces GC Volver a:

  • el gestor de contexto primavera (en forma de extractos contexto XML)
  • la SessionFactory (en forma de consultas)

Me gustaría optimizar estas 2 cosas, y yo pensar Son causadas respectivamente por:

  • Cada prueba tiene un @SpringApplicationContext anotación
  • Cada prueba también utiliza los unitils @DataSet anotación para cargar los datos para esa prueba.

Nota, yo uso jdbc: hsqldb: archivo a descargar parte de datos fuera de la pila (es decir, en lugar de utilizar jdbc: hsqldb: mem)

Versiones:
hsqldb 1.8.0.7
Primavera 3.0.4.RELEASE
unitils 3.1

PS Puede alguien con una calificación 1500+ favor Etiqueta esta pregunta con "unitils"?

¿Fue útil?

Solución

Si la memoria es tomada por los datos almacenados en la base de datos, puede hacer tablas basadas del disco utilización de bases de datos para reducir el uso de memoria. Esto puede ser especificado en la URL de la base de datos:

database.url = jdbc: hsqldb: file: mytestdb; hsqldb.default_table_type = caché

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top