我目前正在构建一个 Java 应用程序,它最终可以在许多不同的平台上运行,但主要是 Solaris、Linux 和 Windows 的变体。
有没有人能够成功提取信息,例如当前使用的磁盘空间、CPU 利用率和底层操作系统中使用的内存? Java 应用程序本身正在消耗什么?
最好我想在不使用 JNI 的情况下获取这些信息。
原文由 Steve M 发布,翻译遵循 CC BY-SA 4.0 许可协议
java.lang.management 包确实为您提供了比运行时更多的信息 - 例如,它会给您堆内存( ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
分开.
您还可以获得进程 CPU 使用率(无需编写自己的 JNI 代码),但您需要将 java.lang.management.OperatingSystemMXBean
转换为 com.sun.management.OperatingSystemMXBean
。这适用于 Windows 和 Linux,我还没有在其他地方测试过。
例如…更频繁地调用 get getCpuUsage() 方法以获得更准确的读数。
public class PerformanceMonitor {
private int availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();
private long lastSystemTime = 0;
private long lastProcessCpuTime = 0;
public synchronized double getCpuUsage()
{
if ( lastSystemTime == 0 )
{
baselineCounters();
return;
}
long systemTime = System.nanoTime();
long processCpuTime = 0;
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );
lastSystemTime = systemTime;
lastProcessCpuTime = processCpuTime;
return cpuUsage / availableProcessors;
}
private void baselineCounters()
{
lastSystemTime = System.nanoTime();
if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )
{
lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();
}
}
}
原文由 Patrick Wilkes 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.6k 阅读
4 回答715 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答974 阅读✓ 已解决
您可以从 Runtime 类中获取一些有限的内存信息。它确实不是您正在寻找的东西,但我想为了完整起见我会提供它。这是一个小例子。编辑:您还可以从 java.io.File 类获取磁盘使用信息。磁盘空间使用需要 Java 1.6 或更高版本。