2015-02-09 37 views
0

我使用java编写的非常大的web项目。 当我点击某个按钮或者做其他动作时,很难理解应用程序代码中调用哪些方法(因为我在项目和应用程序中的新增功能真的很大)。所以我想知道是否有一个工具可以获得给定间隔(比如说每100毫秒)的一些线程的堆栈跟踪。 我知道VisualVm,​​但它不允许这样做,我可以只在一个时间点获得线程哑(没有办法连续获取堆栈跟踪)。Java监控工具,可以实时查看堆栈跟踪

有人可以建议工具或任何技术,这将允许我在运行时监视方法调用。 感谢

+1

我怀疑有一种方法可以做到这一点。 Profiler会做类似的事情,但它的目的是统计使用情况,而不是产生堆栈跟踪。我认为你最好的选择是采取一个你需要的特定用例,并在调试器中跟踪它。随着时间的推移,你将学习整个应用程序 – markspace 2015-02-09 16:25:16

回答

1

对于这种情况,我使用Java Mission Control。完整的功能适用于Oracle JDK,对于OpenJDK并非一切正常。 More info

从网站:

与Oracle JDK 7更新40(7u40)的版本开始,Java的任务控制是捆绑在一起的热点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,检查分配和死锁检测+选择线程并查看当前正在执行的内容。和其他一些图表和有价值的信息。

+0

非常感谢,我正在检查它(我在JDK 6(() 我会接受你的答案,一旦我测试它,但无论如何谢谢)) – user1321466 2015-02-09 16:48:15

+0

不客气,如果你有机会移动到JDK7或JDK8,您将获得高性能。当甲骨文接管Sun时,JDK6是在发布之间。而且JDK8还有一件大事。 – 2015-02-09 16:50:09

1

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

  • 使用JConsole的主题标签,您将能看到所有线程都活着,什么状态他们在。
  • 使用JvisualVm(与jdk安装一起付费),或者您可以使用jprofiler/yourkit等任何分析器在开发模式下运行时查看堆栈跟踪。
  • 你可以得到的堆栈跟踪说每分钟通过在Windows
  • 运行在UNIX kill -3 pidcontrol + break你可以使用jstack命令来获得跟踪。
  • 您可以使用say IDE(eclipse/netbeans/Intellij等)调试代码,在每个方法调用跟踪方法调用之后。
1

存在许多用于Java VM监视和应用程序监视的工具。例如,看到eG Java Application Monitor

...的例如,Java监控器给你 活动的JVM中一个全面的看法:

  • 它可以让你看到哪些线程运行在JVM以及它们处于什么状态 (例如可运行,阻塞,等待,定时等待, 死锁或高CPU)。
  • 您还可以访问每个显示类,方法和代码行的线程的 的堆栈跟踪(以排除 问题直至代码级别)。
  • 而且您可以监视垃圾回收进程的性能,CPU和内存使用情况以及JVM重新启动。