在java 9中查询交换空间

Sel*_*lim 7 java telemetry java-9

由于我使用的sigar库版本中的错误(返回swap的伪值),我尝试使用com.sun.management.OperatingSystemMXBean.这很好,给了我想要的结果(在Windows上).

Class<?> sunMxBeanClass = Class.forName("com.sun.management.OperatingSystemMXBean");
sunMxBeanInstance = sunMxBeanClass.cast(ManagementFactory.getOperatingSystemMXBean());
getFreeSwapSpaceSize = getMethodWithName(sunMxBeanClass, "getFreeSwapSpaceSize");
getTotalSwapSpaceSize = getMethodWithName(sunMxBeanClass, "getTotalSwapSpaceSize");
Run Code Online (Sandbox Code Playgroud)

然而,这打破了java 9.还有另一种方法来使用java查询交换文件/分区信息吗?我不想介绍一个新的库或版本的sigar.

跨平台解决方案受到赞赏,但Windows足够了: - )

谢谢

Hol*_*ger 9

您可以尝试动态发现可用的MX属性:

public class ExtendedOsMxBeanAttr {
    public static void main(String[] args) {
        String[] attr={ "TotalPhysicalMemorySize", "FreePhysicalMemorySize",
                        "FreeSwapSpaceSize", "TotalSwapSpaceSize"};
        OperatingSystemMXBean op = ManagementFactory.getOperatingSystemMXBean();
        List<Attribute> al;
        try {
            al = ManagementFactory.getPlatformMBeanServer()
                                  .getAttributes(op.getObjectName(), attr).asList();
        } catch (InstanceNotFoundException | ReflectionException ex) {
            Logger.getLogger(ExtendedOsMxBeanAttr.class.getName())
                  .log(Level.SEVERE, null, ex);
            al = Collections.emptyList();
        }
        for(Attribute a: al) {
            System.out.println(a.getName()+": "+a.getValue());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没有对com.sun类的依赖,甚至没有反射访问.


Ala*_*man 7

jdk.management模块导出com.sun.management API,它在JDK 9中的工作方式与在JDK 8中的工作方式相同.因此,以下任一方法都可以工作:

com.sun.management.OperatingSystemMXBean mbean
    = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long free = mbean.getFreePhysicalMemorySize();
long swap = mbean.getTotalSwapSpaceSize();
Run Code Online (Sandbox Code Playgroud)

要么

OperatingSystemMXBean mbean = ManagementFactory.getOperatingSystemMXBean();
Class<?> klass = Class.forName("com.sun.management.OperatingSystemMXBean");
Method freeSpaceMethod = klass.getMethod("getFreeSwapSpaceSize");
Method totalSpaceMethod = klass.getMethod("getTotalSwapSpaceSize");
long free = (long) freeSpaceMethod.invoke(mbean);
long swap = (long) totalSpaceMethod.invoke(mbean);
Run Code Online (Sandbox Code Playgroud)

  • 可能值得强调的是,有两个不同的(易混淆)模块,`java.management`和`jdk.management`.使用后者不可避免地会为应用程序添加更多依赖项,但可以直接使用`com.sun.management.OperatingSystemMXBean`.使用前者需要动态发现这些扩展.(为什么他们不只是在基础界面上提供这些属性在我之上;它不像没有大量的可选属性......) (4认同)