Java - 用于Windows的getOpenFileDescriptorCount

ban*_*lit 6 java file-descriptor

如何在Windows下获取打开的文件描述符的数量?

在unix上有这样的:

UnixOperatingSystemMXBean.getOpenFileDescriptorCount()
Run Code Online (Sandbox Code Playgroud)

但似乎没有相同的窗口?

Jon*_*son 1

这本来是一条评论,但有点啰嗦。

关于为什么ServerFault 上可能缺乏等效项的答案相互矛盾:Windows Server 2008 R2 max open files limit 。TLDR:Windows 仅受可用硬件的限制,而 Windows 则受 32 位与 64 位实现的限制(MS Technet 博客文章 - 突破 Windows 的极限:句柄)。当然,这是旧信息。

但!com.sun.management 如果您注意到该包的 JavaDocs ,您当然会注意到明显缺少UnixOperatingSystemMXBean扩展OperatingSystemMXBean以提供该功能的 Windows 版本。Even 的UnixOperatingSystemMXBean存在只是为了提供getMaxFileDescriptorCount()getOpenFileDescriptorCount()因此 Windows 似乎不太可能有相同的概念。

编辑:

我确实找到了一个不错的小程序来展示这一点,我对其进行了调整。 描述符.java

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;

class Descriptors {
    public static void main(String [ ] args) {
        System.out.println(osMxBean.getClass().getName());
        OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean();
        try {
            Method getMaxFileDescriptorCountField = osMxBean.getClass().getDeclaredMethod("getMaxFileDescriptorCount");
            Method getOpenFileDescriptorCountField = osMxBean.getClass().getDeclaredMethod("getOpenFileDescriptorCount");
            getMaxFileDescriptorCountField.setAccessible(true);
            getOpenFileDescriptorCountField.setAccessible(true);
            System.out.println(getOpenFileDescriptorCountField.invoke(osMxBean) + "/" + getMaxFileDescriptorCountField.invoke(osMxBean));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Linux 上:

com.sun.management.UnixOperatingSystem
11/2048
Run Code Online (Sandbox Code Playgroud)

在 Windows 上:

sun.management.OperatingSystemImpl
java.lang.NoSuchMethodException: 
sun.management.OperatingSystemImpl.getMaxFileDescriptorCount()
at java.lang.Class.getDeclaredMethod(Unknown Source)
at Descriptors.main(Descriptors.java:10)
Run Code Online (Sandbox Code Playgroud)