【发布时间】:2017-02-28 08:57:47
【问题描述】:
我有一个 24/7 运行的 Java 应用程序,它连接到 MySQL 服务器和 TimerTask(正在运行 Akka)。在运行一周或更短时间后,我遇到了 OutOfMemoryError,堆转储显示了一个包含超过 400 万个字符串的 LinkedHashMap,它们有一个 java.io.DeleteOnExitHook 的 GC 根,使用 800 MB 的堆。
所有字符串都类似于 /tmp/jar_cachexxxx.tmp
这个问题在两台运行 OpenJDK Runtime Environment (build 1.8.0_101-b13) 的机器上是一致的。 JDBC 驱动程序是 maven "mysql-connector-java" 版本 5.1.38 上提供的驱动程序,我使用的是连接池 BoneCP,版本 0.8.0。
有人知道这个泄漏吗?
更新 -- 2016 年 5 月 12 日
在我们为项目更改编译器后,问题已解决。我们注意到 eclipse jar creator 是唯一与 jar 缓存有任何关系的东西,所以在我们用 maven 编译项目后,内存泄漏就消失了。
【问题讨论】:
-
您能否提供更多信息,您是如何访问数据库和使用 Akka 的?你在打电话 Java.io.File.deleteOnExit() 吗?你看过多少个看起来像“/tmp/jar_cachexxxx.tmp”的字符串?这可能是一个红鲱鱼。即使有 1000 个这些字符串也不占 800MB。尝试寻找其他字符串。
-
您如何确定所有字符串看起来像“/tmp/jar_cachexxxx.tmp”? 800MB 意味着您需要大约 800MB/30bytes=26,666,666 个类似这样的字符串。
标签: java memory-leaks out-of-memory akka