当前位置: 首页 > 面试题库 >

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

宇文学博
2023-03-14
问题内容

对于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(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负载很难衡量,我通常坚持执行时间并优化较长/重复的部分



 类似资料:
  • 我正在Repast 2.7中构建一个ABM,我们正在进入项目的阶段,我们正在交付更大的生产数据集来通知我们的模型。 我注意到在我的32核工作站上,可执行文件只使用了3-12核;平均cpu消耗稳定在5.5%左右。它似乎应该使用更多的内核;或者最大限度地利用它正在使用的核心。我意识到这可能是天真的猜测。 报告32核心可用。 我有兴趣知道是否以及如何配置我的项目以利用更多资源。我意识到HPC版本可用;但

  • 问题内容: 我有一段使用解释器执行的JavaScript代码。 如何测量这些数据库插入操作所花费的时间?我可以计算这段代码前后的日期值之差,但是由于代码的异步特性,这将是不正确的。 问题答案: 使用Node.js 和:

  • 问题内容: 我想计算我的函数在Java中执行需要多少CPU时间。目前我正在做如下。 但是我发现,对于相同的I / PI,根据系统负载,获得不同的时间。 因此,如何获得我的函数执行所需的确切CPU时间。 问题答案: 随着JVM预热,所需的时间会有所不同。第二次运行将始终比第一次运行快。(第一次必须加载类并调用静态块)运行该方法10,000次后,它将再次更快(将代码编译为本机机器代码的默认阈值) 为了

  • 问题内容: 说“用cpu = 800和内存= 1024运行myApp.jar” 我从事Java编程已经很多年了,问这个问题很尴尬。我什至不知道这是否可能。如果是这样,怎么办? 我只想知道是否可以设置Java程序的最大内存和cpu使用率。我突然想到了这个,因为我最近开始开发移动应用程序。我想知道该应用程序在内存和处理器非常有限的设备上的表现。 我看到带有演示应用程序的物理引擎可以在浏览器上运行,也可

  • 我想比较一个函数的不同实现: 我得到的结果是,第一个度量值总是比第二个慢(

  • 问题内容: 可以说,钱不是限制因素,我想编写一个在一台功能强大的计算机上运行的Java程序。 目的是使Java程序 尽可能快地运行,而不必 为任何事情 交换或进入磁盘 。 假设这台计算机具有: 1 TB RAM(64个16GB DIMM) 64个处理器核心(8个8核处理器) 运行64位Ubuntu 运行在JVM中的Java程序的单个实例能否利用这么多的RAM和处理器? 是否有任何实际的考虑因素可能