java - 测量代码段的 Java 执行时间、内存使用情况和 CPU 负载

标签 java performance monitoring jmx measurement

对于特定的 Java 代码段,我想测量:

  • 执行时间(很可能线程执行时间)
  • 内存使用情况
  • CPU 负载(具体归因于代码段)

我是一个相对的 Java 新手,不熟悉如何实现这一点。有人提到我 JMX ,但是我不确定如何使用它,而且对于我想要做的事情来说,JMX 看起来有点“笨重”。

理想情况下,我想要一些测量类,可以告诉我想要测量什么,并可以选择调用 start()代码段和 stop() 之前的方法之后的方法。相关指标将记录到我指定的文件中。

例如:

import com.example.metricLogger;

metricLogger logger = new metricLogger();

logger.setLogPath(pathToLogFile);
logger.monitor(executionTime);
logger.monitor(memoryUsage);
logger.monitor(cpuLoad);

logger.start();

/* Code to be measured */

logger.stop();

Java 中有没有标准/通用/传统的方法来实现这一点?

此类测量用于一次性性能比较,因此我不会寻找任何生产中的长期监控流程。

我非常高兴能够引用教程或外部示例,并且不期望在这里得到完整的答案。也就是说,如果能够实现像上面这样简单的事情,那么一个现实的例子将会非常顺利。

最佳答案

分析可能是一个更简单的选择,因为您不需要生产中的统计数据。分析也不需要修改代码。 VisualVM(随 JDK 1.6.06+ 一起提供)是一个简单的工具。如果您想要更深入的东西,我会选择 Eclipse TPTP、Netbeans profiler 或 JProfiler(付费)。

如果您想自己编写,请考虑以下事项:

可以通过“计时”您感兴趣的部分来完成执行时间等简单测量:

long start = System.nanoTime(); // requires java 1.5
// Segment to monitor
double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9;

您可以使用类似的技术通过 Runtime.getRuntime().*memory() 方法来监视内存。请记住,跟踪垃圾收集环境中的内存使用情况比简单的减法更棘手。

CPU 负载在 Java 中很难测量,我通常坚持执行时间并优化较长/重复的部分

关于java - 测量代码段的 Java 执行时间、内存使用情况和 CPU 负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133899/

相关文章:

java - 如何找到@OneToOne映射的反面?

C++ std::vector 插入两个元素替代算法失败

database - 为什么我的千分尺在应用程序启动后只执行一次?

Java-如何使用枚举收集类?

java - NetBeans 中的 JUnit

java - 用java编写一个程序,返回一个新数组,该数组包含大于数组中第一个值的所有值

wcf - 监控 WCF Web 服务

ios - UIScrollView性能问题

javascript - JQuery 切换方法在 1000+ UL 上运行缓慢

javascript - Munin 用于实时监控和 Javascript 绘图