对于特定的Java代码段,我想测量:
我是一名相对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中是否有任何标准/通用/传统方式实现此目的?
此类测量用于一次性性能比较,因此我不会寻找任何正在进行中的长期监测过程。
我很高兴被引用到教程或外部示例,并且不希望在这里得到完整答案。也就是说,如果能够实现上述任何简单的事情,那么一个现实的例子就会非常好。
答案 0 :(得分:19)
分析可能是一个更容易的选项,因为您不需要生产中的统计数据。分析也不需要修改代码。 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负载,我通常会坚持执行时间并优化更长/重复的部分
答案 1 :(得分:5)
使用ThreadMXBean,您可以获得单个线程的CPU使用率和消耗的CPU时间,而不是可能有用的经过时间。
然而,使用分析器通常更简单,因为此过程通常会生成大量数据,您需要一个良好的可视化工具来查看正在发生的事情。
我使用Yourkit,因为我发现更容易解决我使用过的其他分析器的问题。 我也使用内置的hprof,因为这可以为您提供关于应用程序配置文件的不同视图(但不是很有用)
答案 2 :(得分:1)
使用Java Profiler 是最佳选择,它将为您提供代码中所需的所有洞察力。即响应时间,线程调用跟踪,内存使用等
我建议你JENSOR,一个开源Java Profiler,因为它易于使用且CPU开销很低。您可以下载它,检测代码并获得有关代码的所有信息。
您可以从以下网址下载:http://jensor.sourceforge.net /
答案 3 :(得分:0)
通过收集执行期间的cpu和内存指标,我们可以测量特定调用方法使用的cpu和内存。
当然,如果其他方法的其他并发线程在执行过程中消耗内存和cpu,则会陷入困境。因此,当您能够以隔离方式执行方法时,这是一种有效的方法。
对于CPU,您可以获取其当前值:
OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(
OperatingSystemMXBean.class);
double processCpuLoad = osBean.getProcessCpuLoad();
对于内存,您可以这样做:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
int currentHeapUsedInMo = (int) (memoryMXBean.getHeapMemoryUsage().getUsed() / 1_000_000);
关于存储量度,在执行该方法之前等待主要收集可提高其可靠性。
例如类似的事情可能会有所帮助:
import com.google.common.testing.GcFinalization;
GcFinalization.awaitFullGc();
foo.execute(); // method to execute
GcFinalization
来自Guava test library。
所有这些开销很少。因此,该想法是为要监视的每个调用方法收集指标(例如每秒),并在方法返回时为它们计算最大值/平均值或任何有用的信息。
我希望AOP能够做到这一点。
Spring AOP是一种创建方面和为其设置切入点的简单且不错的方法,但是如果您需要一些有关AOP功能的特定内容,也可以使用AspectJ进行。