【发布时间】:2016-03-15 17:45:46
【问题描述】:
我正在运行 Play! 2.3 使用 Akka 的多线程应用程序。每个线程访问一个 MySQL 数据库并运行一些计算。每次我运行一组这些任务时,应用程序的内存占用都会增加,这主要是由于JDBC4PreparedStatement 对象永远不会消失。运行几次后,这些对象占用了超过 200MB,很快就会出现内存不足错误调用Sytem.gc() 根本不会降低它。
我正在使用 Hibernate 4.3.0 进行持久化,并且在 EntityManager 上调用 clear() 也无济于事,因此并不是任何地方都存储了持久对象。 This answer 暗示可能有Statement 对象在某处处于打开状态,但我从不直接与Statement 对象或Connection 对象交互,只使用JPA 的EntityManager。
这是 MySQL JDBC 或 JPA 的预期行为吗?我该如何解决这个内存泄漏?我不确定在哪里寻找解决方案,不确定这是由于 MySQL、JDBC、JPA 还是 Hibernate 的实现引起的。或者可能的方式播放!处理 JPA。
编辑
需要明确的是,我没有使用 Connection 或 Statement 对象,所以我没有什么可以关闭的。这是一个示例,我在事务中从 Play 获取 EntityManager,做一些事情,然后事务提交。
JPA.withTransaction( () -> {
Site site= JPA.em().find(Site.class, siteId);
site.setDomain("www.stackoverflow.com");
});
【问题讨论】:
-
您是否检查过相关的 SE 问题,例如 stackoverflow.com/questions/5664831/… 和 stackoverflow.com/questions/5675184/…?
-
没有特别看到这些。那些问题只是一次加载太多到内存中,而不是任何类型的泄漏。完成后,我会非常小心地清除任何持久性缓存。在这一点上,我什至经常使用
EntityManager.clear(),以牺牲速度为代价。
标签: java mysql hibernate jpa playframework-2.0