0

我从事用java编写的非常大的网络项目。当我单击某个按钮或执行其他操作时,我很难理解应用程序代码中调用了哪些方法(因为我是项目新手,而且应用程序真的很大)。所以我想知道是否有一个工具可以让你以给定的时间间隔(比如每 100 毫秒)获取一些线程的堆栈跟踪。我知道 VisualVm,​​但它不允许这样做,我只能在某个时间点让线程哑(没有办法连续获取堆栈跟踪)。

有人可以建议允许我在运行时监视方法调用的工具或任何技术吗?谢谢

4

3 回答 3

1

有多种方法可以检查堆栈跟踪:

  • 使用 jconsole 的线程选项卡,您将看到哪些线程处于活动状态以及它们处于什么状态。
  • 使用 JvisualVm(安装 jdk 时需要付费)或者您可以使用任何分析器(如 jprofiler/yourkit 等)在开发模式下运行时查看堆栈跟踪。
  • kill -3 pid您可以通过在 unix 或control + breakWindows 上运行每分钟获取堆栈跟踪信息
  • 您可以使用jstack命令来获取跟踪。
  • 您可以使用 IDE(eclipse/netbeans/Intellij 等)调试代码,并在每个方法调用之后跟踪方法调用。
于 2015-02-09T16:29:15.460 回答
1

对于这种情况,我使用 Java Mission Control。全部功能适用于 Oracle JDK,对于 OpenJDK,并非一切都正常工作。更多信息

从网站:

从 Oracle JDK 7 Update 40 (7u40) 的发布开始,Java Mission Control 与 HotSpot JVM 捆绑在一起。

您需要在 JVM 中添加以下参数才能使用它。注意:我通常还会添加调试选项。

JAVA_DEBUG="-Xdebug -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=n"
JAVA_JMC="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=3614 -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false -XX:+UnlockCommercialFeatures -XX:+FlightRecorder"

然后您需要远程连接到端口 3614,您将能够看到 JVM 内部。在那里,您将能够分析 CPU、检查分配和死锁检测 + 选择线程并查看当前正在执行的内容。以及其他一些图表和有价值的信息。

于 2015-02-09T16:41:18.063 回答
1

存在许多用于 Java VM 监控和应用程序监控的工具。例如,请参阅eG Java 应用程序监视器

...eG Java Monitor 让您全面了解 JVM 中的活动:

  • 它可以让您查看 JVM 中正在运行哪些线程以及它们处于什么状态(例如可运行、阻塞、等待、定时等待、死锁或高 CPU)。
  • 您还可以访问显示类、方法和代码行的每个线程的堆栈跟踪(以解决代码行级别的问题)。
  • 并且您可以监控垃圾收集进程的性能、CPU 和内存使用情况以及 JVM 重启。
于 2015-02-10T05:12:06.507 回答