![](/img/trans.png)
[英]How do I monitor the computer's CPU, memory, and disk usage in Java?
[英]How do I check CPU and Memory Usage in Java?
我需要用java检查服务器的CPU和内存使用情况,有人知道怎么做吗?
如果您正在专门寻找 JVM 中的内存:
Runtime runtime = Runtime.getRuntime();
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("free memory: " + format.format(freeMemory / 1024) + "<br/>");
sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "<br/>");
sb.append("max memory: " + format.format(maxMemory / 1024) + "<br/>");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "<br/>");
然而,这些只能作为估计......
import java.io.File;
import java.text.NumberFormat;
public class SystemInfo {
private Runtime runtime = Runtime.getRuntime();
public String info() {
StringBuilder sb = new StringBuilder();
sb.append(this.osInfo());
sb.append(this.memInfo());
sb.append(this.diskInfo());
return sb.toString();
}
public String osName() {
return System.getProperty("os.name");
}
public String osVersion() {
return System.getProperty("os.version");
}
public String osArch() {
return System.getProperty("os.arch");
}
public long totalMem() {
return Runtime.getRuntime().totalMemory();
}
public long usedMem() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
public String memInfo() {
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("Free memory: ");
sb.append(format.format(freeMemory / 1024));
sb.append("<br/>");
sb.append("Allocated memory: ");
sb.append(format.format(allocatedMemory / 1024));
sb.append("<br/>");
sb.append("Max memory: ");
sb.append(format.format(maxMemory / 1024));
sb.append("<br/>");
sb.append("Total free memory: ");
sb.append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
sb.append("<br/>");
return sb.toString();
}
public String osInfo() {
StringBuilder sb = new StringBuilder();
sb.append("OS: ");
sb.append(this.osName());
sb.append("<br/>");
sb.append("Version: ");
sb.append(this.osVersion());
sb.append("<br/>");
sb.append(": ");
sb.append(this.osArch());
sb.append("<br/>");
sb.append("Available processors (cores): ");
sb.append(runtime.availableProcessors());
sb.append("<br/>");
return sb.toString();
}
public String diskInfo() {
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
StringBuilder sb = new StringBuilder();
/* For each filesystem root, print some info */
for (File root : roots) {
sb.append("File system root: ");
sb.append(root.getAbsolutePath());
sb.append("<br/>");
sb.append("Total space (bytes): ");
sb.append(root.getTotalSpace());
sb.append("<br/>");
sb.append("Free space (bytes): ");
sb.append(root.getFreeSpace());
sb.append("<br/>");
sb.append("Usable space (bytes): ");
sb.append(root.getUsableSpace());
sb.append("<br/>");
}
return sb.toString();
}
}
如果您使用的是 Sun JVM,并且对应用程序的内部内存使用情况(您的应用程序使用了多少已分配的内存)感兴趣,我更愿意打开 JVM 内置垃圾收集日志记录。 您只需将 -verbose:gc 添加到启动命令。
从 Sun 文档:
命令行参数 -verbose:gc 打印每个集合的信息。 请注意,-verbose:gc 输出的格式可能会在 J2SE 平台的发行版之间发生变化。 例如,这是一个大型服务器应用程序的输出:
[GC 325407K->83000K(776768K), 0.2300771 secs] [GC 325816K->83372K(776768K), 0.2454258 secs] [Full GC 267628K->83769K(776768K), 1.8479984 secs]
在这里,我们看到两个小集合和一个主要集合。 箭头前后的数字
325407K->83000K (in the first line)
分别表示垃圾回收前后活动对象的组合大小。 在次要集合之后,计数包括不一定处于活动状态但无法回收的对象,或者因为它们直接处于活动状态,或者因为它们在老年代内或从老年代引用。 括号内的数字
(776768K) (in the first line)
是总可用空间,不包括永久代中的空间,它是总堆减去一个幸存者空间。 次要集合花费了大约四分之一秒。
0.2300771 secs (in the first line)
有关更多信息,请参阅: http : //java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
从这里
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
long prevUpTime = runtimeMXBean.getUptime();
long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
double cpuUsage;
try
{
Thread.sleep(500);
}
catch (Exception ignored) { }
operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long upTime = runtimeMXBean.getUptime();
long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
long elapsedCpu = processCpuTime - prevProcessCpuTime;
long elapsedTime = upTime - prevUpTime;
cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors));
System.out.println("Java CPU: " + cpuUsage);
JMX,提供的 MXBeans(ThreadMXBean 等)将为您提供内存和 CPU 使用率。
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
operatingSystemMXBean.getSystemCpuLoad();
对于内存使用,以下将起作用,
long total = Runtime.getRuntime().totalMemory();
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
对于 CPU 使用率,您需要使用外部应用程序来衡量它。
从 Java 1.5 开始,JDK 附带了一个新工具: JConsole,它可以显示任何 1.5 或更高版本 JVM 的 CPU 和内存使用情况。 它可以绘制这些参数的图表,导出到 CSV,显示加载的类数,实例数,死锁,线程等......
如果您使用在这里的许多答案中发布的 runtime/totalMemory 解决方案(我已经做了很多),如果您想要相当准确/一致的结果,请务必先强制执行两次垃圾回收。
为了提高效率,Java 通常允许垃圾在强制 GC 之前填满所有内存,即使这样它通常也不是完整的 GC,因此 runtime.freeMemory() 的结果始终介于“真实”可用内存量和 0 之间.
第一次 GC 并没有得到一切,它得到了大部分。
上升趋势是,如果您只执行 freeMemory() 调用,您将得到一个绝对无用且变化很大的数字,但如果先执行 2 gc,则这是一个非常可靠的衡量标准。 它还使例程慢得多(可能是几秒钟)。
Java 的Runtime对象可以报告 JVM 的内存使用情况。 对于 CPU 消耗,您必须使用外部实用程序,例如 Unix 的 top 或 Windows 进程管理器。
我还将添加以下方法来跟踪 CPU 负载:
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;
double getCpuLoad() {
OperatingSystemMXBean osBean =
(com.sun.management.OperatingSystemMXBean) ManagementFactory.
getPlatformMXBeans(OperatingSystemMXBean.class);
return osBean.getProcessCpuLoad();
}
你可以在这里阅读更多
JConsole是一种监视正在运行的 Java 应用程序的简单方法,您也可以使用 Profiler 获取有关应用程序的更多详细信息。 我喜欢为此使用NetBeans Profiler 。
下面是一些简单的代码来计算当前的内存使用量(以兆字节为单位):
double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));
如果您使用 Tomcat,请查看Psi Probe ,它可以让您监控内部和外部内存消耗以及许多其他区域。
我想在现有答案中添加注释:
这些方法只跟踪 JVM 内存。 实际进程可能会消耗更多内存。
java.nio.ByteBuffer.allocateDirect() 是一个函数/库,很容易被遗漏,并且确实分配了本机内存,这不是 Java 内存管理的一部分。
在 Linux 上,您可以使用这样的方法来获取实际消耗的内存: https : //linuxhint.com/check_memory_usage_process_linux/
对于 Eclipse,您可以使用 TPTP(测试和性能工具平台)来分析内存使用情况等。 更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.