我在Linux系统上运行Java应用程序。我注意到应用程序似乎消耗了大量文件句柄(几天后我得到“太多打开的文件”)。
因此,当我使用'lsof'命令转储与Java应用程序关联的所有文件时,我得到如下内容:
java 2690 root 239u REG 3,2 428057 94300 /tmp/jar_cache5782499018536796385.tmp (deleted)
java 2690 root 240u REG 3,2 58955 94360 /tmp/jar_cache3818842806647031366.tmp (deleted)
java 2690 root 241u REG 3,2 28673 94301 /tmp/jar_cache8793213887943479521.tmp (deleted)
java 2690 root 242u REG 3,2 67115 94302 /tmp/jar_cache3648070144390426051.tmp (deleted)
我只在这里展示了4个,但实际上有87个并且数量在时间上增长。
从我在网上看到的内容,Java在内部或其他地方使用这些临时文件,它们是正常的。
正如上面的输出所示,它们被删除了,我确认它们在文件系统上不存在。
但我害怕的是它没有发布文件描述符或任何相关的内存......有没有人知道这些'/tmp/jar_cache####.tmp'文件或有经验这些?
答案 0 :(得分:1)
通过URLClassloader加载jar时会生成/ tmp / jar_cache文件。我怀疑应用程序的某些组件正在重新加载,这会导致删除旧的jar_cache文件并创建新的文件。文件句柄未发布的事实看起来像JVM问题 - 我也看到过这种行为以及相同的JDK版本。
这个JVM错误上有这些注释: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4166799
虽然这个问题已经暂时关闭了。