2009-01-15 158 views
4

我想了解为什么Apache CXF在第一次初始化Web服务时就会跑开“做些什么”。 “Something”可能是某种IO,我猜它试图解析某种外部地址/模式/ DTD。在java应用程序中跟踪IO?

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

关于我如何追踪发生了什么的任何建议?

回答

2

。您可以使用filemon窗口,它会列出所有文件访问,并允许您对其进行过滤,所以你只能看到这些过程的你感兴趣的内容。

貌似更多的最近版本的Windows Process Monitor的是前进的道路。

4

一种方法,如果你真的想知道发生了什么是在Apache进程上运行'strace'或'ltrace'。有一个简短的介绍here。有趣的是strace应该阻止某个呼叫,即等待I/O,如果你的假设是正确的。

要检查某个进程正在使用哪些文件(和网络套接字),请查看'lsof'。例如,要检查哪些文件是由一定的进程打开:

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

要检查在一般的网络连接,尝试用“netstat”

2

除了与strace和Filemon的,其监视来自OS的应用程序级别,您可能还想给交互式分析器一个镜头。像Sun的免费VisualVM这样的工具可以显示各种方法被调用的频率,以及生成和查看线程转储的简单方法。这样,你可以看到应用程序是否在你自己的代码中旋转,或者如果线程阻塞了等待一些从未完成的IO。

+1

我实际上是在使用jprofiler,并发现IO在特定的方法中发生,但仍然无法完全看到发生了什么。 – krosenvold 2009-01-16 08:05:46

2

这是最有可能忙于解决WSDL,解析它,处理它,等....

其实,第一次,它也处理所有涉及装载模式对于那些在Spring配置文件以及和验证等等。

你也可以运行诸如wireshark之​​类的东西来跟踪所有的网络流量,看看它是否会出去获取任何东西。

+0

我正在从资源加载wsdl。但看起来你是对的。添加一些类加载,只需要很多时间。 – krosenvold 2009-01-20 09:22:02

1

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