0

何千ものテストを含む大きなマルチモジュール Maven プロジェクトがあります。各テストは、SpringApplicationContext アノテーションを使用して DAO やサービスなどをロードします。私の 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.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

テストを実行すると、ヒープに割り当てられた 2GB が最終的にいっぱいになります。Permgen は約 400MB に達します。ヒープ ダンプを見ると、charjava.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」のタグを付けてください。

4

1 に答える 1

1

データベースに格納されたデータがメモリを消費する場合は、データベースでディスク ベースのテーブルを使用して、メモリの使用を減らすことができます。これは、データベース URL で指定できます。

database.url=jdbc:hsqldb:file:mytestdb;hsqldb.default_table_type=cached

于 2010-09-24T16:04:17.353 に答える