如何找出Java应用程序当前打开的文件数?


问题内容

假设您的应用程序所做的很多事情都与读取文件内容有关。不用说,打开然后关闭的文件很有效,除非…新文件的传入速度比旧文件快。这是我发现自己遇到的情况的泡菜。

现在,有没有办法可靠地知道该进程打开了多少文件?像ls /proc/my_pid/fd | wc -l从JVM内部看一样可靠的东西吗?

我怀疑答案可能是特定于操作系统的,所以让我补充一点,我在Linux上运行Java。


问题答案:

在Unix上,一种方法是使用ManagementFactory获取方法OperatingSystemMxBean,如果是UnixOperatingSystemMXBean,则可以使用该getOpenFileDescriptorCount()方法。

示例代码:

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import com.sun.management.UnixOperatingSystemMXBean;

public class OpenFileCount{
    public static void main(String[] args){
        OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
        if(os instanceof UnixOperatingSystemMXBean){
            System.out.println("Number of open fd: " + ((UnixOperatingSystemMXBean) os).getOpenFileDescriptorCount());
        }
    }
}