来自 Java 的 CPU 负载
有没有办法在Java下不使用JNI获取当前cpu负载?
Is there a way to get the current cpu load under Java without using the JNI?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有没有办法在Java下不使用JNI获取当前cpu负载?
Is there a way to get the current cpu load under Java without using the JNI?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
使用
ManagementFactory
< /a> 获取OperatingSystemMXBean< /code>
并调用
getSystemLoadAverage()
就可以了。Use the
ManagementFactory
to get anOperatingSystemMXBean
and callgetSystemLoadAverage()
on it.getSystemLoadAverage() 为您提供 1 分钟内的值(每秒刷新一次),并给出整个操作系统的该值。 应通过单独监视每个线程来完成更多实时概述。 还需要注意的是监视刷新间隔 - 您检查该值的频率越高,在给定时刻的值就越精确,如果您每毫秒执行一次,则它通常为 0 或 100(或更多,具体取决于有多少个 CPU)。 但是,如果我们允许时间范围(例如 1 秒),我们就会得到这段时间的平均值,并且得到信息更丰富的结果。 另外,值得注意的是,只有一个线程占用多个 CPU(核心)的可能性极小。
以下实现允许使用 3 种方法:
getUsageByThread(Thread t) - 指定线程的总负载
getSystemLoadAverage() gives you value over 1 minute of time (refreshes every second) and gives this value for overall operating system. More realtime overview should be done by monitoring each thread separately. Important is also notice the monitoring refresh interval - more often you check the value, more precice it is in given moment and if you do it every millisecond, it is typically 0 or 100 (or more depending how many CPU's is there). But if we allow timeframe (for example 1 second), we get avarage over this period of time and we get more informative result. Also, it is important to notice, that it is highly unlikely, that only one thread occupies more than one CPU (core).
Following implementation allows to use 3 methods:
getUsageByThread(Thread t) - Total load by specified thread
这确实涉及 JNI,但 Hyperic 有一个名为 Sigar 的 GPL 库,它提供了此信息所有主要平台,以及许多其他依赖于操作系统的统计信息,例如磁盘使用情况。 这对我们来说非常有效。
This does involve JNI but there is a GPL library from Hyperic called Sigar that provides this information for all the major platforms, as well as a bunch of other OS-dependent stats like disk usage. It's worked great for us.
在 Linux 上,您可以只读取文件 /proc/loadavg,其中前三个值代表负载平均值。 对于 Windows,您可能必须坚持使用 JNI。
On linux you could just read the file /proc/loadavg, where the first three values represent the load averages. For Windows you probably have to stick to JNI.
在 Linux 下,您可以使用 Runtime . exec() 执行“uptime”并评估输出。 我认为在 Linux 下没有更好的方法,并且我认为在 Windows 下也没有同样“方便”的方法。
Under Linux you could use Runtime.exec() to execute “uptime” and evaluate the output. I don’t there’s a better way under Linux, and I don’t think there’s an equally “convenient” way under Windows.
如果您使用 JRockit JVM 您可以使用 < a href="http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/releases/R27/javadoc/manapi27.2/docs/index.html" rel="nofollow noreferrer">JMAPI。 它适用于 JDK 1.4、1.5 和 1.6。
If you're using the JRockit JVM you could use JMAPI. It works for JDK 1.4, 1.5 and 1.6.