java计时 - jvm cpu使用率过高




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

使用ThreadMXBean,您可以获取单个线程的CPU使用情况以及消耗的cpu时间,而不是经过时间,这可能是有用的。

然而,在这个过程中使用探查器通常会比较简单,通常会产生大量的数据,而且您需要一个很好的可视化工具来查看正在发生的事情。

我使用Yourkit,因为我发现它更容易解决我用过的其他分析器的问题。 我也使用内置的hprof,因为这可以给你对应用程序的配置文件有不同的看法(但不是有用的)

对于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分析器或JProfiler(支付)。

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

简单的测量,如执行时间可以通过“时钟”你感兴趣的部分:

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

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

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







measurement