有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA/HSQLDB仍然在消耗我所有的内存

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

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

内存中最大的对象似乎是hsqldb。会议。HSQlDb会为每个事务缓存大量数据吗?在磁盘上只需要1GB的RAM就可以得到120MB的内存,这似乎太过分了,不是吗

请告诉我下一步可以尝试什么


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    这可能是不同的原因。我想介绍一下内存泄漏分析工具: 1) 首先,在任务管理器中找到流程id

    2)然后进行堆转储:

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

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

    jhat <file>
    

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

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

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

    安装它并转到它的透视图。 打开并选择选项以查找内存泄漏

    对于HSQLDB: 通常MemoryAnalizer显示内存在

    CompiledStatementManager.csidmap
    

    -然后确保你总是打电话

    statement.close()
    
  3. # 3 楼答案

    在与HSQLDB闲聊了两天后,我听从了两个朋友的建议,将数据库改为H2。现在事务中的内存占用大约是三分之一,速度也快了20%

    真让我吃惊