DeleteOnExitHook上的内存泄漏

Max*_*und 4 java memory-leaks out-of-memory akka

我有一个全天候运行的Java应用程序,它有一个连接MySQL服务器和一个TimerTask(运行Akka).我遇到的OutOfMemoryError一周后或更少的操作和堆转储显示LinkedHashMap中有超过4百万的字符串,他们使用800 MB堆java.io.DeleteOnExitHook的GC根.

所有字符串都类似于/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年12月5日

在我们更改了项目的编译器之后,问题已经解决了.我们注意到eclipse jar创建者是唯一与jar缓存有任何关系的东西,所以在用maven编译项目之后,内存泄漏就消失了.

Jim*_*son 7

这是一个长期存在且众所周知的错误,多年来已经向Sun/Oracle报告了很多次.当前的错误号是JDK-4872014.

问题是每次使用delete-on-exit API时,File都会存储到HashMap.因为在长时间运行的服务器中,您的代码很少会故意退出,所以如果您使用大量临时文件执行此操作,则地图可以无限制地增长.

从本质上讲,API不适用于长时间运行的服务器,因为它并不是真正意图以这种方式使用.如果您需要此功能,则需要自己实现它并按计划运行清理,以某种方式知道可以删除哪些文件.


die*_*n07 0

您的应用程序中的某些内容正在使用 File.deleteOnExit。但由于您的应用程序永远不存在,Java 必须跟踪所有这些文件,因为它们需要在它最终退出时删除(这永远不会发生)。我建议您使用调试器找出应用程序的哪个部分执行此操作,然后找到替代方案。