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

如何跟踪Java中的方法调用?

双恩
2023-03-14
问题内容

考虑下面的两个简单的Java类:

第一个例子

class Computer {
    Computer() {
        System.out.println("Constructor of Computer class.");
    }
    void On() {
        System.out.println("PC turning on...");
    }
    void working() {
        System.out.println("PC working...");
    }
    void Off() {
        System.out.println("PC shuting down...");
    }
    public static void main(String[] args) {
        Computer my = new Computer();
        Laptop your = new Laptop();
        my.On();
        my.working();
        your.On();
        your.working();
        my.Off();
        your.Off();
   }
}

第二个例子

class Laptop {
    Laptop() {
        System.out.println("Constructor of Laptop class.");
    }
    void On() {
        System.out.println("Laptop turning on...");
    }
    void working() {
        System.out.println("Laptop working...");
    }
    void Off() {
        System.out.println("Laptop shuting down...");
    }
}

程序运行后,如何跟踪(1)哪个对象调用哪个方法(2)以及执行多少次?

稍微精确一点,我可能有100个类和1000个对象,每个对象都调用100多个方法。我希望能够跟踪(在运行程序之后)哪个对象调用了哪种方法以及调用了多少次。

感谢您的任何建议。


问题答案:

这将为所有线程中所有对象的每个方法调用打印一行:

Runtime.traceMethodCalls()(在Java 9中已弃用/无操作)

Runtime.traceInstructions(在Java 9中已弃用/无操作)

您可以使用 housemd
btrace
inTrace之 类的呼叫跟踪器



要进行更复杂的分析,可以使用以下一种调用图实用程序:

  • javashot

  • java-callgraph

(这是 一篇有关该主题的文章

计划将上面不推荐使用的方法删除,因为现在有特定于JVM的替代方法:

  • 截至版本56,是JDK 7的Java Flight Recorder 部件。需要商业许可才能在 生产中 使用 __
  • VisualVM Free /流行的第三方

这两个工具都非常容易设置和开始收集信息,并且具有不错的GUI界面。它们附加到正在运行的JVM进程上,并允许进行线程快照和其他各种诊断(Visual
VM有很多可用的插件,但是如果您想超越默认行为,则可能需要花一些时间来进行配置和了解,而默认情况下,JFR具有更多功能)。

另外,请不要低估JVM分布式命令行实用程序($JAVA_HOME/bin)用于执行一些易于访问的诊断的有用性。

  • jstack 堆栈跟踪
  • jmap 内存映射
  • jstat JVM统计信息监视
  • jhat 堆分析工具
  • jdb 调试器
  • jinfo java进程或核心文件配置信息


 类似资料:
  • 问题内容: 有没有一种方法可以为java中的特定线程输出调用跟踪? 我不需要堆栈跟踪。我想在每个对象上进行一系列调用以进行跟踪。 问题答案: 我想您可能会发现这很有趣。它是一个Java代理,它使用slf4j框架将日志记录添加到方法中,从而实际记录输出。然后,只需配置日志记录框架以仅打印出您感兴趣的线程即可。 http://www.slf4j.org/extensions.html#javaagen

  • 我很难找到一种方法来跟踪方法执行(例如:在执行时调用方法...) 下面是我想追踪的代码片段: 我想知道JsonSaniitier类的方法sanitize已被调用... 我尝试运行jStack,但是在堆栈跟踪中没有看到任何JsonSanitizer.sanitize方法的出现。 提前谢谢

  • 我做了很多年的Java开发人员,主要是使用spring开发MVC Web应用程序。我正在学习Kotlin和Android作为一个自我开发项目,并且大部分都很喜欢它。我通常只是把事情弄清楚,但我认为我在这里遗漏了一些重要的东西(因为我喜欢编写易于维护且不容易出现异常的代码)。我理解与Java的互操作性,我只是对我的Kotlin代码是如何编译的感到困惑,并且对Java方法调用抛出异常没有任何警告。 下

  • 对于单元测试目的和模板方法模式,我需要动态调用一些方法,如下所示: 这是可行的,但当方法失败(断言失败或运行时异常)时,我无法获得完整的失败跟踪。例如,如果您有一个序列调用:method1()- 这是在代码中显式调用“方法1()”时的正常显示。但是如果这样做了:myobject.get类()。get方法(“方法1”)。调用()。如果方法3失败,您会有以下失败跟踪: 因此,当使用反射(m.invok

  • 问题内容: 如何获得Java中的当前堆栈跟踪,就像你可以在.NET中那样? 我找到了,但这不是我想要的-我想找回堆栈跟踪信息,而不是打印出来。 问题答案: 你可以使用。 这将返回一个数组,该数组代表程序的当前堆栈跟踪。

  • 问题内容: 如何理解java的栈跟踪(stack trace) ?怎样使用它来调试程序? 问题答案: 简单来说,堆栈跟踪是应用程序在引发时处于中间的方法调用的列表。 简单的例子 通过问题中给出的示例,我们可以准确确定在应用程序中引发异常的位置。让我们看一下堆栈跟踪: 这是一个非常简单的堆栈跟踪。如果我们从列表的开头开始,我们可以判断出错误发生在哪里。我们正在寻找的是应用程序中最顶层的方法调用。在这