【发布时间】:2011-01-03 22:03:55
【问题描述】:
我正在尝试调试在 Linux 上的 Jetty 7.0.1 中运行的 Java webapp 中的文件描述符泄漏。
应用程序已经愉快地运行了一个月左右,但由于打开的文件太多导致请求开始失败,不得不重新启动 Jetty。
java.io.IOException: Cannot run program [external program]: java.io.IOException: error=24, Too many open files
at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
at java.lang.Runtime.exec(Runtime.java:593)
at org.apache.commons.exec.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:58)
at org.apache.commons.exec.DefaultExecutor.launch(DefaultExecutor.java:246)
起初我以为问题出在启动外部程序的代码上,但它使用的是commons-exec,我看不出有什么问题:
CommandLine command = new CommandLine("/path/to/command")
.addArgument("...");
ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream();
Executor executor = new DefaultExecutor();
executor.setWatchdog(new ExecuteWatchdog(PROCESS_TIMEOUT));
executor.setStreamHandler(new PumpStreamHandler(null, errorBuffer));
try {
executor.execute(command);
} catch (ExecuteException executeException) {
if (executeException.getExitValue() == EXIT_CODE_TIMEOUT) {
throw new MyCommandException("timeout");
} else {
throw new MyCommandException(errorBuffer.toString("UTF-8"));
}
}
列出服务器上打开的文件我可以看到大量的 FIFO:
# lsof -u jetty
...
java 524 jetty 218w FIFO 0,6 0t0 19404236 pipe
java 524 jetty 219r FIFO 0,6 0t0 19404008 pipe
java 524 jetty 220r FIFO 0,6 0t0 19404237 pipe
java 524 jetty 222r FIFO 0,6 0t0 19404238 pipe
Jetty 启动时只有 10 个 FIFO,几天后就有数百个。
我知道现阶段有点含糊,但您对下一步该往哪里看,或者如何获取有关这些文件描述符的更详细信息有什么建议吗?
【问题讨论】:
-
添加了启动外部程序的代码。
-
作为附加信息来源 netstat -anp --tcp|grep
--color 可以是 -
在 try-catch 之后添加 finally 块并关闭所有流。流可能没有正确关闭,因此您收到此错误。另请注意,linux 会处理打开文件中的打开连接数,因此请检查您的代码是否打开连接。
标签: java linux jetty ioexception file-descriptor