Answers:
您可以从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());
}
}
}
与运行时相比,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();
}
}
}
OperatingSystemMXBean
给com.sun.management.OperatingSystemMXBean
和序言的所有实例getOperatingSystemMXBean()
用ManagementFactory.
。您需要适当地导入所有类。
getCpuUsage
意味着该系统是使用其所有availableProcessors在100%?
((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
我认为最好的方法是通过Hyperic实现SIGAR API。它适用于大多数主要操作系统(几乎是任何现代操作系统),并且非常易于使用。开发人员对他们的论坛和邮件列表的响应非常迅速。我还喜欢它是GPL2 Apache许可的。他们也提供了很多Java示例!
有一个Java项目使用JNA(因此无需安装本机库)并且正在积极开发中。它目前支持Linux,OSX,Windows,Solaris和FreeBSD,并提供RAM,CPU,电池和文件系统信息。
对于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();
这是详细信息的链接。
您可以通过使用System.getenv()
传递相关的环境变量名称作为参数来获取一些系统级信息。例如,在Windows上:
System.getenv("PROCESSOR_IDENTIFIER")
System.getenv("PROCESSOR_ARCHITECTURE")
System.getenv("PROCESSOR_ARCHITEW6432")
System.getenv("NUMBER_OF_PROCESSORS")
对于其他操作系统,相关环境变量的存在/不存在和名称将有所不同。
通过maven添加OSHI依赖项:
<dependency>
<groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId>
<version>2.2</version>
</dependency>
获取剩余的电池电量百分比:
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));
}
看一下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”之类的东西...
对于Matt提到的SIGAR进行认真的CPU监视,SIGAR似乎是最好的选择。
在上Windows
,您可以运行systeminfo
命令并使用以下代码获取其输出,例如:
private static class WindowsSystemInformation
{
static String get() throws IOException
{
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("systeminfo");
BufferedReader systemInformationReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = systemInformationReader.readLine()) != null)
{
stringBuilder.append(line);
stringBuilder.append(System.lineSeparator());
}
return stringBuilder.toString().trim();
}
}
如果您使用的是Jrockit VM,则这是获取VM CPU使用率的另一种方法。运行时bean还可以为您提供每个处理器的CPU负载。我仅在Red Hat Linux上使用过此功能来观察Tomcat的性能。您必须在catalina.sh中启用JMX remote才能起作用。
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://my.tomcat.host:8080/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
ObjectName name = new ObjectName("oracle.jrockit.management:type=Runtime");
Double jvmCpuLoad =(Double)conn.getAttribute(name, "VMGeneratedCPULoad");
它仍在开发中,但您已经可以使用jHardware
这是一个简单的库,可使用Java抓取系统数据。它可以在Linux和Windows中使用。
ProcessorInfo info = HardwareInfo.getProcessorInfo();
//Get named info
System.out.println("Cache size: " + info.getCacheSize());
System.out.println("Family: " + info.getFamily());
System.out.println("Speed (Mhz): " + info.getMhz());
//[...]
一种可以用来获取操作系统级别信息的简单方法,我在Mac上进行了测试,效果很好:
OperatingSystemMXBean osBean =
(OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
return osBean.getProcessCpuLoad();
您可以在此处找到许多与操作系统相关的指标
嘿,您可以通过java / com集成来做到这一点。通过访问WMI功能,您可以获得所有信息。
要在Java代码中获得平均 1分钟,5分钟和15分钟的平均系统负载,您可以通过cat /proc/loadavg
使用以下命令并解释如下命令来实现:
Runtime runtime = Runtime.getRuntime();
BufferedReader br = new BufferedReader(
new InputStreamReader(runtime.exec("cat /proc/loadavg").getInputStream()));
String avgLine = br.readLine();
System.out.println(avgLine);
List<String> avgLineList = Arrays.asList(avgLine.split("\\s+"));
System.out.println(avgLineList);
System.out.println("Average load 1 minute : " + avgLineList.get(0));
System.out.println("Average load 5 minutes : " + avgLineList.get(1));
System.out.println("Average load 15 minutes : " + avgLineList.get(2));
并通过执行命令然后解释如下来获取物理系统内存free -m
:
Runtime runtime = Runtime.getRuntime();
BufferedReader br = new BufferedReader(
new InputStreamReader(runtime.exec("free -m").getInputStream()));
String line;
String memLine = "";
int index = 0;
while ((line = br.readLine()) != null) {
if (index == 1) {
memLine = line;
}
index++;
}
// total used free shared buff/cache available
// Mem: 15933 3153 9683 310 3097 12148
// Swap: 3814 0 3814
List<String> memInfoList = Arrays.asList(memLine.split("\\s+"));
int totalSystemMemory = Integer.parseInt(memInfoList.get(1));
int totalSystemUsedMemory = Integer.parseInt(memInfoList.get(2));
int totalSystemFreeMemory = Integer.parseInt(memInfoList.get(3));
System.out.println("Total system memory in mb: " + totalSystemMemory);
System.out.println("Total system used memory in mb: " + totalSystemUsedMemory);
System.out.println("Total system free memory in mb: " + totalSystemFreeMemory);
Runtime.getRuntime().freeMemory()
如建议在公认的回答没有给你的可用内存量。