我的Java Web应用程序有问题:几天后失败,错误为FileSystemException: Too many open files
。我理解这意味着什么,但是我无法弄清没有关闭文件的位置。因此,我试图编写一些调试代码来帮助我找到此错误的原因:该代码应该返回所有文件描述符(并通过debug http端点显示它):
Files.list(Paths.get(String.format("/proc/$d/fd", pid))).map(
fd -> String.format(
"%s:%s",
fd.getFileName(),
// also I tried fd.toRealPath()
fd.toFile().getCanonicalFile()
)
).collect(Collectors.toList())
但是此代码不会显示断开的链接(删除目标的符号链接)。 Path.toRealPath()
在此处失败,并带有NoSuchFileException
,Path.toFile().getCanonicalPath()
会忽略此类链接,并且不会显示目标。只有系统ls -l /proc/$pid/fd/
可以正常工作并解决所有链接。
是否可以使用Java(1.8 JDK)解析此类链接?
将我的评论变成答案,我可以看到两个选项来确定文件是否为无效的符号链接:
Files.readSymbolicLink()
,然后检查目标是否存在。Files.exists()
与不同的选项一起使用:如果文件带有NOFOLLOW_LINKS
,但没有该选项就不存在,那么它应该是悬挂的符号链接。