在 java 9 中查询交换空间

Posted

技术标签:

【中文标题】在 java 9 中查询交换空间【英文标题】:Querying swap space in java 9 【发布时间】:2018-06-27 18:51:48 【问题描述】:

由于我正在使用的 sigar 库版本中存在错误(为交换返回虚假值),我尝试改用 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");

但是这与 java 9 不同。还有其他方法可以使用 java 查询交换文件/分区信息吗? 我不想介绍新的库或 sigar 版本

赞赏跨平台解决方案,但 windows 就足够了 :--)

谢谢

【问题讨论】:

【参考方案1】:

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();

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);

【讨论】:

可能值得强调的是,有两个不同(容易混淆)的模块,java.managementjdk.management。使用后者不可避免地会给应用程序增加更多的依赖项,但会使com.sun.management.OperatingSystemMXBean 直接可用。使用前者需要动态发现这些扩展。 (为什么他们不只是在基本界面中提供这些属性,我在上面;这并不是说还没有大量的可选属性……)【参考方案2】:

您可以尝试动态发现可用的 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());
        
    

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

【讨论】:

以上是关于在 java 9 中查询交换空间的主要内容,如果未能解决你的问题,请参考以下文章

交换空间或页面文件中的页面

linux交换空间

linux交换空间

如何找出 Linux 中哪些进程正在使用交换空间?

(急)linux怎样更改交换空间的大小

77 swapon-激活Linux系统中交换空间