在Mac上以Java形式描述CPU使用情况

时间:2009-10-06 10:56:12

标签: java profiling java-native-interface cpu-usage

我正在寻找一种方法来测量我的java代码中不同方法的cpu使用情况。我知道这可以使用JNI和C实现,但我不知道从哪里开始......

这样做的目的是比较不同的算法,并提供定性结果。

8 个答案:

答案 0 :(得分:1)

我认为您无法使用当前的分析器范围将CPU使用率确定为方法级别。对于大多数方法来说,它是非常明显的(如果该方法是计算绑定的并且是单线程的,那么它将使用100%的CPU,而不受操作系统的分配)。

您可能想要识别热点(方法消耗的CPU比您预期的要多 - 或者可能更少?)我建议您查看YourKit以获得易于配置的分析器。< / p>

如果不这样做,请查看JVM分析界面(JVMPI),它可能会为您提供更多指示。

答案 1 :(得分:1)

最常见的方法可能是使用采样。 JVM提供了一些工具来询问它所有线程(或您感兴趣的线程)的当前堆栈跟踪,以及它们消耗了多少CPU。所以你定期这样做。在每次调用时,如果一个线程在你感兴趣的方法中,那么假设它花费了自该方法中最后一次轮询以来报告的CPU时间的一半。

如果这种方法听起来合适,不久前我在Java 5 profiling facilities上写了一些可能对你有帮助的材料。

Java 5还提供了一个Instrumentation框架,通过该框架,您可以在加载它们时对类进行调整,以包括对您的给定方法的入口和出口的调用,因此您可以在该方法内部测量CPU使用率。但是,编程要复杂一些,因为在加载时需要对实际的类二进制文件进行操作。

答案 2 :(得分:1)

Sun VisualVM集成在最近的JDK及其profiling capabilities are explained here中。请注意,如果我正确理解this,它似乎需要一个相当新的OSX版本 Netbeans在船上有基本相同的分析机制,我不知道这是否有任何帮助。

答案 3 :(得分:0)

如果您想使用已有的分析工具之一,那么您可以尝试Shark

答案 4 :(得分:0)

看看OperatingSystemMXBean或许你可以在方法之前和之后看一些东西

long startProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
long endProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();

仅限Java6

答案 5 :(得分:0)

我不确定这是否是您想要的,但我过去使用jrat进行分析,结果不错。

答案 6 :(得分:0)

检查JaMon。很容易使用。

答案 7 :(得分:0)

在单独的线程中调用您的方法,并测量执行给定过程之前和之后的时间增量。

测量过程调用的时间:

    ManagementFactory.getThreadMXBean().setThreadCpuTimeEnabled(true);
    long threadTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();