Wil*_*del 202
您可以从Runtime类中获取一些有限的内存信息.这真的不是你想要的,但我想我会为了完整而提供它.这是一个小例子.编辑:您还可以从java.io.File类获取磁盘使用信息.磁盘空间使用情况需要Java 1.6或更高版本.
public class Main {
public static void main(String[] args) {
/* Total number of processors or cores available to the JVM */
System.out.println("Available processors (cores): " +
Runtime.getRuntime().availableProcessors());
/* Total amount of free memory available to the JVM */
System.out.println("Free memory (bytes): " +
Runtime.getRuntime().freeMemory());
/* This will return Long.MAX_VALUE if there is no preset limit */
long maxMemory = Runtime.getRuntime().maxMemory();
/* Maximum amount of memory the JVM will attempt to use */
System.out.println("Maximum memory (bytes): " +
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));
/* Total memory currently available to the JVM */
System.out.println("Total memory available to JVM (bytes): " +
Runtime.getRuntime().totalMemory());
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
/* For each filesystem root, print some info */
for (File root : roots) {
System.out.println("File system root: " + root.getAbsolutePath());
System.out.println("Total space (bytes): " + root.getTotalSpace());
System.out.println("Free space (bytes): " + root.getFreeSpace());
System.out.println("Usable space (bytes): " + root.getUsableSpace());
}
}
}
Run Code Online (Sandbox Code Playgroud)
Pat*_*kes 93
该java.lang.management包确实给你比运行了一大堆更多信息-例如,它会给你堆内存(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
)从非堆内存分开(ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).
您还可以获得进程CPU使用率(无需编写自己的JNI代码),但需要将其转换java.lang.management.OperatingSystemMXBean
为a 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*ngs 42
我认为最好的方法是通过Hyperic实现SIGAR API.它适用于大多数主要操作系统(靠近任何现代设备)并且非常容易使用.开发人员对他们的论坛和邮件列表非常敏感.我也喜欢它是GPL2 Apache许可.它们也提供了大量的Java示例!
dB.*_*dB. 23
有使用JNA(所以没有机库安装),并正在积极开发的Java项目.它目前支持Linux,OSX,Windows,Solaris和FreeBSD和提供RAM,CPU,电池和文件系统信息.
Yan*_*ski 12
对于Windows我走了这条路.
com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long physicalMemorySize = os.getTotalPhysicalMemorySize();
long freePhysicalMemory = os.getFreePhysicalMemorySize();
long freeSwapSize = os.getFreeSwapSpaceSize();
long commitedVirtualMemorySize = os.getCommittedVirtualMemorySize();
Run Code Online (Sandbox Code Playgroud)
这是与细节的链接.
Ale*_*ndr 11
您可以通过使用System.getenv()
相关环境变量名称作为参数来获取一些系统级信息.例如,在Windows上:
System.getenv("PROCESSOR_IDENTIFIER")
System.getenv("PROCESSOR_ARCHITECTURE")
System.getenv("PROCESSOR_ARCHITEW6432")
System.getenv("NUMBER_OF_PROCESSORS")
Run Code Online (Sandbox Code Playgroud)
对于其他操作系统,相关环境变量的存在/不存在和名称将有所不同.
通过maven添加OSHI依赖:
<dependency>
<groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId>
<version>2.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
获得剩余百分比的电池容量:
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
for (PowerSource pSource : hal.getPowerSources()) {
System.out.println(String.format("%n %s @ %.1f%%", pSource.getName(), pSource.getRemainingCapacity() * 100d));
}
Run Code Online (Sandbox Code Playgroud)
查看java.lang.management包中提供的API .例如:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
那里还有许多其他有用的东西.
CPU使用率并不简单 - 通过com.sun.management.OperatingSystemMXBean.getProcessCpuTime的java.lang.management接近(参见上面Patrick的优秀代码片段),但请注意,它只能访问CPU在您的进程中花费的时间.它不会告诉您在其他进程中花费的CPU时间,甚至不会告诉您执行与进程相关的系统活动所花费的CPU时间.
例如,我有一个网络密集型的java进程 - 它是唯一运行的东西,CPU是99%,但只有55%被报告为"处理器CPU".
尽管它是MX bean上唯一与cpu相关的项目,但它甚至没有让我开始"平均负载",因为它是无用的.如果只有太阳在偶尔的智慧中暴露出类似"getTotalCpuTime"的东西......
对于严重的CPU监控,Matt提到的SIGAR似乎是最好的选择.
归档时间: |
|
查看次数: |
220797 次 |
最近记录: |