2010-10-09 81 views
3

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

我试图通过在我的EntityManager上调用flushclear方法来解决这个问题,但是这没有效果。我也试图确保实体与所有其他实体的引用保存在内存中。

内存中最大的对象似乎是hsqldb.Sessions。难道HSQlDb会缓存每笔交易的大量数据吗?如果仅仅需要1GB的RAM,那么在磁盘上只有120MB的数据库才会结束呢?

请告诉我可以尝试下一步。

+0

尝试手动刷新的实体管理器而坚持的实体。调用EntityManager.flush()可以清除内存中不必要的引用。但我不知道它是否能解决你的问题。 – 2010-10-09 21:03:19

+0

@feridcelik - 我目前正在冲洗,然后清除:) – willcodejavaforfood 2010-10-09 21:10:47

回答

2

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

真的很惊讶,我

+0

看起来你一直在使用HSQLDB 1.8.x.具有CACHED表的HSQLDB 2.0.x的事务内存使用量要低得多。 – fredt 2010-10-19 10:03:10

+0

@fredt - 谢谢你。现在回到HSQLDB已经太晚了,但对于我的下一个项目,我会再给它一次:) – willcodejavaforfood 2010-10-19 10:07:26

2

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

+0

好消化,因为我不知道为什么会发生这种情况。我只是认为清除EntityManager会释放所有的内存。 – willcodejavaforfood 2010-10-09 22:21:50

+0

这表明它是因为某种原因持有内存的HSQLDB。这是否意味着它是数据库配置问题,应用程序设计问题还是事务设计问题? :) – willcodejavaforfood 2010-10-10 12:14:18

+0

哪些类使用最多的内存? – 2010-10-11 06:49:33

0

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

2)再取一个堆转储:

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

3)然后分析它: 一个)与jHat util的:

jhat <file> 

b)(一建议)安装Eclipse内存分析器插件从

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

(Eclipse:help-> install new software - > add repository)

安装它并进入它的视角。 打开并选择选项来查找内存泄漏。

在HSQLDB的情况下: 通常MemoryAnalizer显示,在

CompiledStatementManager.csidmap 

使用的内存 - 然后确保你总是叫

statement.close()