当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《测量代码段的Java执行时间,内存使用和CPU负载》经验,为你挑选了2个好方法。

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

执行时间(很可能是线程执行时间)

内存使用情况

CPU负载(特别是可归因于代码段)

我是一个相对Java的新手,并不熟悉如何实现这一点.我已经被提到了JMX,但是我不确定如何使用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> basszero..:

由于您不需要生产中的统计数据,因此分析可能更容易.分析也不需要修改代码.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()方法监视内存.请记住,在垃圾收集环境中跟踪内存使用比简单减法更棘手.

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


测量结果可能包括垃圾收集时间,在JIT编译器中花费的时间,由于其他进程而在操作系统中花费的时间,其他进程花费的时间,或者执行"要监视的段"的时间可能是两个比起调用`nanoTime()`的时间要小的级数.仅仅因为`nanoTime()`返回纳秒并不意味着它的分辨率如此之高.

2> Peter Lawrey..:

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

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

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

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有