对于特定的 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/