JPA / HSQLDB仍在吃掉我所有的记忆

时间:2010-10-09 20:36:34

标签: java hibernate jpa hsqldb

我正在开发一个解析文件数据并将其存储到HSQLDB数据库的程序。当解析器遇到数据时,它会创建使用JPA / Hibernate映射到数据库的实体。 我的问题是,在执行解析时,应用程序使用越来越多的内存。我已经成功使用了缓存表,因此一旦解析完成,内存全部被释放,但在解析期间它使用比我更舒服的方式。

我尝试通过在我的EntityManager上调用flushclear方法来解决此问题,但这没有任何效果。我还试图确保引用所有其他实体的Entity保存在内存中。

内存中最大的对象似乎是hsqldb.Sessions。可能是HSQlDb为每个事务缓存了大量数据吗?看起来过于需要1GB的RAM才能最终得到磁盘上120MB的数据库吗?

请告知我接下来可以尝试的事项。

3 个答案:

答案 0 :(得分:2)

执行堆转储并使用Eclipse MAT分析内存的使用位置。使用JPA,结果往往令人惊讶,并且没有考虑实际的内存使用情况,而是经常在黑暗中刺伤。

答案 1 :(得分:2)

在使用HSQLDB两天后,我按照两个朋友的建议,将数据库更改为H2。交易期间的内存占用量大约是现在的三分之一,而且速度也提高了20%。

真让我感到惊讶

答案 2 :(得分:0)

可能是不同的原因。我想描述内存泄漏分析工具: 1)首先,在任务管理器中找到process_id;

2)然后进行堆转储:

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

3)然后分析它: a)JHAT util:

jhat <file>

b)(我建议)从

安装Eclipse Memory Analyzer插件
http://download.eclipse.org/mat/1.3/update-site/

(Eclipse:help-&gt;安装新软件 - &gt;添加存储库)

安装它并转到它的角度。 打开并选择查找内存泄漏的选项。

对于HSQLDB: 通常MemoryAnalizer显示

中使用的内存
CompiledStatementManager.csidmap

- 然后确保你总是打电话

statement.close()