我有一个在 Linux 上运行的 Java 应用程序,PID 为 25426。运行时lsof -p 25426
, 我注意到:
java 25426 uid 420w FIFO 0,8 0t0 273664482 pipe
java 25426 uid 421r FIFO 0,8 0t0 273664483 pipe
java 25426 uid 461r FIFO 0,8 0t0 273622888 pipe
java 25426 uid 463w FIFO 0,8 0t0 273633139 pipe
java 25426 uid 464r FIFO 0,8 0t0 273633140 pipe
java 25426 uid 465r FIFO 0,8 0t0 273622889 pipe
java 25426 uid 471w FIFO 0,8 0t0 273623682 pipe
java 25426 uid 472r FIFO 0,8 0t0 273633141 pipe
这个结果应该如何解读?
我正在对打开文件过多的问题进行故障排除,并尝试了解此观察结果是否相关。
随着应用程序继续运行,数量pipe
条目有所不同(上升和下降)。
定义
-
java- 打开文件的过程。
-
25426- 这应该是真正的PID。如果没有,请通过发布标题让我们知道它是什么。
-
420w - 文件描述符编号,后跟打开它的模式。 (读/写)
-
0,8- 主要次要设备识别。
-
273664482- 文件的索引节点。
-
pipe- 在您的应用程序中打开的 FIFO 管道。
解释
您没有关闭所有流。有许多处于读取或写入模式的打开文件描述符正在写入未命名管道。发生这种情况的最常见情况是人们使用Runtime.getRuntime.exec() http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29然后继续保持与该进程关联的流打开。您可以使用 commons IO utils 库来关闭它们 http://mark.koli.ch/2011/01/leaky-pipes-remember-to-close-your-streams-when-using-javas-runtimegetruntimeexec.html或者你可以自己关闭它们 https://github.com/GreenGroup/RMG-Java/commit/c56ff8d.
try
{
p = Runtime.getRuntime().exec("something");
}
finally
{
if (p != null)
{
IOUtils.closeQuietly(p.getOutputStream());
IOUtils.closeQuietly(p.getInputStream());
IOUtils.closeQuietly(p.getErrorStream());
}
}
如果这不是问题,您将需要深入研究代码库并确定泄漏流的位置并堵住它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)