1

我的问题来自实际实践:我有一个应用程序,它依赖于外部(网络)服务。如果某些服务无法访问,我的应用程序将冻结,我不明白问题出在哪里。

我自己不编写应用程序,如果出现问题,源代码也不会使用日志记录。

我运行jconsole并查看所有带有跟踪的线程(例如在我之前的 Windows 本机应用程序工作中使用procexp执行此操作)。但是有120个线程!!

所以我想在跟踪中找到一些类(或包/类的正则表达式模式)的线程并打印该跟踪。所以我找到了发生网络等待的地方。

jconsole应用程序表明这在理论上是可行的(但我真的不希望点击jconsole界面中的所有 120 个线程,我通过眼睛搜索我的包)。

我需要运行完整的调试器jdb吗?我是否需要使用一些选项来启动我的应用程序(实际上是 Jboss 应用程序服务器中的 Spring 应用程序)以允许检索此类信息?

我是 Emacs 的老用户,所以通过命令行实用程序将所有线程与本地运行的应用程序的痕迹一起转储也解决了我的问题。

我更喜欢连接到正常(没有任何调试调整)运行的应用程序,因为这似乎没有必要。

4

1 回答 1

1

我运行jvisualvm访问“线程”选项卡并按“线程转储”按钮并获得询问信息!

所以我可以将报告保存到文件并使用正则表达式在Emacs中执行搜索。

我只是忘记了jconsole 已被弃用,因为最近才回到 Java 世界(从低级 C 世界)。

但是请免费将我指向非交互式命令行解决方案...

UPDATE kill -QUIT $pid使 Java 进程将线程跟踪转储到标准输出。jps -l帮助查找Java进程。如果重新定义了标准输入(Tomcat AS 等) - 请查看 AS 日志!

于 2012-11-29T06:51:40.473 回答