2010-10-09 3 views
3

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

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

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

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

+0

Попробуйте вручную промывке диспетчер сущностей, а сохраняющиеся объекты. Вызов EntityManager.flush() может очистить ненужные ссылки в памяти. Но я не уверен, решит ли он вашу проблему. –

+0

@feridcelik - я сейчас смываю, а затем очищаю :) – willcodejavaforfood

ответ

2

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

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

+0

Похоже, вы используете HSQLDB 1.8.x. Использование транзакционной памяти HSQLDB 2.0.x с таблицами CACHED значительно ниже. – fredt

+0

@fredt - Спасибо за это. Слишком поздно возвращаться к HSQLDB, но для моего следующего проекта я дам ему еще один вариант :) – willcodejavaforfood

2

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

+0

хорошая суеверия, поскольку я понятия не имею, почему это происходит. Я просто подумал, что очистка EntityManager освободит всю память. – willcodejavaforfood

+0

Это показало, что по какой-то причине HSQLDB держится за память. Означает ли это, что это проблема с конфигурацией базы данных или проблема с дизайном приложения или проблема с транзакционным дизайном? :) – willcodejavaforfood

+0

Какие классы используют наибольшую память? –

0

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

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

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

3), а затем проанализировать его: а) JHAT Util:

jhat <file> 

б) (я рекомендую) установить Eclipse, анализатор памяти плагин от

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

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

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

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

CompiledStatementManager.csidmap 

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

statement.close() 
Смежные вопросы