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

2022-09-01 17:41:32

对于 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中是否有任何标准/通用/常规的方法来实现这一目标?

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

我非常乐意被推荐给教程或外部示例,并且不期望在这里得到完整的答案。也就是说,如果像上面这样简单的事情可以实现,那么一个现实的例子将非常好。


答案 1

分析可能是一个更简单的选择,因为你不需要生产中的统计信息。分析也不需要修改代码。VisualVM(与JDK 1.6.06 +一起发布)是一个简单的工具。如果你想要更深入的东西,我会选择Eclipse TPTP,Netbeans profiler或JProfiler(pay)。

如果你想写你自己的,请考虑以下几点:

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

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

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

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


答案 2

使用ThreadMXBean,您可以获得单个线程的CPU使用率和CPU消耗的时间,而不是可能有用的运行时间。

但是,使用探查器通常更简单,因为此过程通常会生成大量数据,并且您需要一个好的可视化工具来查看正在发生的事情。

我使用Yourkit,因为我发现解决我使用过的其他分析器的问题更容易。我还使用内置的hprof,因为这可以为您提供有关应用程序配置文件的不同视图(但没有那么有用)


推荐