JPA / HSQLDB все еще пожирает всю мою память - PullRequest
3 голосов
/ 10 октября 2010

Я работаю над программой, которая анализирует данные из файла и сохраняет их в базе данных HSQLDB.Когда парсер встречает данные, он создает сущности, которые отображаются в базу данных с использованием JPA / Hibernate. Моя проблема в том, что во время синтаксического анализа приложение использует все больше и больше памяти. Я успешно использовал кэшированные таблицы, так что после завершения синтаксического анализа вся память освобождается, но во время синтаксического анализа она использует способбольше, чем мне удобно.

Я пытался исправить это, вызывая методы flush и clear в моем EntityManager, но это не имело никакого эффекта.Я также пытался убедиться, что Entity со ссылками на все другие объекты хранится в памяти.

Кажется, что самыми большими объектами в памяти являются hsqldb.Sessions.Может ли быть так, что HSQlDb кэширует множество данных для каждой транзакции?Кажется чрезмерным, что требуется 1 ГБ ОЗУ, чтобы на диске была только БД размером 120 МБ, не так ли?

Пожалуйста, посоветуйте, что можно попробовать дальше.

Ответы [ 3 ]

2 голосов
/ 11 октября 2010

После двух дней работы с HSQLDB я последовал совету двух друзей и изменил базу данных на H2.Объем памяти во время транзакции составляет примерно треть, а также на 20% быстрее.

Действительно удивил меня

2 голосов
/ 10 октября 2010

Сделайте дамп кучи и используйте Eclipse MAT , чтобы проанализировать, где используется память.С JPA результаты часто бывают удивительными, и, не смотря на фактическое использование памяти, вы часто наносите удар в темноте.

0 голосов
/ 29 августа 2013

Это могут быть разные причины. Я хотел бы описать инструменты для анализа утечек памяти: 1) сначала найдите process_id в вашем диспетчере задач;

2) затем возьмите дамп кучи:

jmap -dump:live,format=b,file=<filename> <process_id>

3) затем проанализируйте это: а) JHAT util:

jhat <file>

b) (я рекомендую) установить плагин Eclipse Memory Analyzer с

http://download.eclipse.org/mat/1.3/update-site/

(Eclipse: help-> установить новое программное обеспечение -> добавить репозиторий)

установите его и перейдите к его перспективе. Откройте и выберите опцию, чтобы найти утечки памяти.

В случае HSQLDB: обычно MemoryAnalizer показывает, что память используется в

CompiledStatementManager.csidmap

- затем убедитесь, что вы всегда звоните

statement.close()
...