打开的文件太多:打开了多少,它们是什么,JVM可以打开多少
我在 Java 中遇到了这个异常:
I'm getting this exception in Java:
java.io.FileNotFoundException: (Too many open files)
我正在寻找解决此问题的方法.
I'm looking for the ways to eliminate this problem.
这个错误显然表明 JVM 分配了太多句柄,而底层操作系统不会让它有更多.要么我在连接/流关闭不正确的地方出现泄漏.
This error obviously indicates that JVM has allocated too many handles and underlying OS won't let it have more. Either I've got leak somewhere with improperly closed connections/streams.
此过程连续运行数天并最终引发异常.它在正常运行 12-14 天后反复发生.
This process runs for days non-stop and eventually throws the exception. It repeatedly happens after 12-14 days of up-time.
你是怎么解决这个问题的?有没有办法在 JVM 中获取已分配句柄的列表或跟踪它何时达到一定数量?我很想把它们打印出来,看看它是如何生长的以及何时生长的.我不能使用分析器,因为它是一个生产系统并且在开发中难以重现它.有什么建议吗?
How do you fight this? Is there a way to get a list of allocated handles in JVM or track when it hits certain amount? I'd love to have them printed and see how it grows and when. I can't use a profiler because it's a production system and have difficulties to reproduce it in development. Any suggestion?
我正在监视空闲堆大小并在它接近 -Xmx 中指定的总数的 1% 时发出警报".我也知道,如果我的线程数达到 500 以上,那么肯定会失控.现在,有没有办法知道我的 JVM 从 OS 分配了 太多的句柄,并且没有返回它们,例如套接字、打开的文件等.如果我知道这些,我就会知道在哪里以及何时查看.
I am monitoring free heap size and raising an "alarm" when it approaches 1% of the total specified in -Xmx. I also know that if my thread count hits above 500, then something definitely goes out of hand. Now, is there a way to know that my JVM allocates too many handles from OS and doesn't give them back, e.g. sockets, opened files, etc. If I'd knew that, I'd know where to look and when.
推荐答案
你没有说你在哪个操作系统上运行,但是如果你在 Linux 上运行你可以使用 lsof 命令
You didn't say which OS you are running on, but if you are running on Linux you can use the lsof command
lsof -p <pid of jvm>
这将列出 JVM 打开的所有文件.或者,如果您在 Windows 上运行,您可以 Process Explorer 这将显示所有所有进程的打开文件.
That will list all the files opened by the JVM. Or if you are running on Windows you can Process Explorer which will show all the open files for all the processes.
这样做有望让您缩小保持文件打开的代码位的范围.
Doing this will hopefully allow you to narrow down which bit of the code is keeping the files open.
相关文章