在java应用程序中跟踪IO?

时间:2009-01-15 08:35:24

标签: java io trace

我试图找出为什么Apache CXF在第一次初始化Web服务时正在逃避“某事”。 “Something”可能是某种IO,我猜它正在尝试解析某种外部地址/架构/ DTD。

所以我试图找到一种可以监视所有IO的钩子。在虚拟机级别或操作系统级别(我可以在Linux和Windows上运行,但我不允许运行wireshark,理论上可能存在文件IO)。

关于如何追踪正在发生的事情的任何建议?

5 个答案:

答案 0 :(得分:4)

如果你真的想知道发生什么事情的一种方法是在apache进程上运行'strace'或'ltrace'。有一个简短的介绍here。有趣的是,strace应该在某个调用中阻塞,即如果你的假设是正确的,则等待i / o。

要检查某个进程正在使用哪些文件(和网络套接字),请查看“lsof”。例如,要检查某个进程打开了哪些文件:

lsof -p process_id  # by PID
lsof -c httpd       # by a process name

要检查网络连接,请尝试'netstat'

答案 1 :(得分:2)

在Windows上,您可以使用filemon,它会列出所有文件访问权限并允许您对其进行过滤,以便您只看到您感兴趣的过程。

看起来更新版本的Windows Process Monitor是前进之路。

答案 2 :(得分:2)

除了从操作系统级别监视应用程序的strace和filemon之外,您可能还想为交互式探查器提供一个镜头。像Sun的免费VisualVM这样的工具可以显示调用各种方法的频率,以及生成和查看线程转储的简便方法。这样,您可以看到应用程序是否在您自己的代码中旋转,或者线程是否阻塞等待一些永远不会完成的IO。

答案 3 :(得分:2)

最有可能忙于解析WSDL,解析它,处理它等等。

实际上,第一次,它还处理所有弹簧配置文件,包括为那些加载模式以及验证等等。

您还可以运行wireshark之​​类的东西来跟踪所有网络流量,看看它是否可以获取任何内容。

答案 4 :(得分:1)

您可以使用InTrace在JVM级别跟踪应用程序。这将允许您识别启动期间正在执行的Java代码。这使用Java代理在加载类时向类添加检测,因此可以为所有正在使用的类生成方法入口/出口调用。