Утечки памяти при воссоздании базы данных Squeryl в памяти - PullRequest
4 голосов
/ 04 марта 2012

Я пишу простое приложение Scala & Squeryl.Для целей тестирования каждый раз, когда я запускаю 'test' в sbt, в памяти создается H2 db и заполняется тестовыми данными.После каждого запуска я вижу, что использование памяти java.exe (внутри которого запускается sbt) в диспетчере задач увеличивается до тех пор, пока после 4 или 5 запусков он не завершится с OutOfMemoryError.Я скучаю по чему-то, что явно освобождает память, используемую H2 или Squeryl?Сейчас я использую только Session.create, а затем Persistence.create.Вот выдержка из моего кода:

object Persistence extends Schema {
  val documents = table[IncomeEntity]
  val positions = table[Position]
  val documentToPositions = oneToManyRelation(documents, positions).via(_.id === _.id_income)
}

class PersistenceTests extends FunSuite with BeforeAndAfterAll {

  override protected def beforeAll() {
    Class.forName("org.h2.Driver")
    SessionFactory.concreteFactory = Some(
      () => Session.create(DriverManager.getConnection("jdbc:h2:mem:test"), new H2Adapter)
    )
  }

  test("DDL") {
    transaction {
      Persistence.create
      assert(Persistence.documents.size == 0)
      assert(Persistence.positions.size == 0)
    }
  } 

  test("Insert") {
    transaction {
      Persistence.create
      (1 to 100) map { _ => IncomeMapper.save(new Income) }
      assert(Persistence.documents.size == 100)
    }
  }
}

Я получаю следующие сообщения:

[info] PersistenceTests:
sbt appears to be exiting abnormally.
  The log file for this session is at C:\Users\Oleg\AppData\Local\Temp\sbt7320472784033855835.log
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

Ответы [ 2 ]

3 голосов
/ 04 марта 2012

Добавьте следующие флаги в ваш стартовый скрипт SBT: -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m. Это должно решить проблему.

UPDATE: Если вы все еще не работаете с JVM, взгляните на SBT-revolver + JRebel: https://github.com/spray/sbt-revolver. Это запустит ваше приложение в раздвоенной JVM, поэтому ваш SBT никогда не должен падать.

1 голос
/ 04 марта 2012

Без дополнительных подробностей (таких как класс схемы, который вы используете, трассировка стека OOME и т. Д.) Трудно догадаться.Одна возможность состоит в том, что вы генерируете экземпляр класса Schema при каждом запуске теста, который кэшируется, что, по моему опыту, является очень неэффективным / неэффективным способом.Убедитесь, что у вас есть только один экземпляр Schema (обычно это просто объект), и / или добавьте дополнительную информацию к вашему вопросу ...

...