【问题标题】:Tracing IO in java application?在java应用程序中跟踪IO?
【发布时间】:2009-01-15 08:35:23
【问题描述】:

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

所以我试图找到某种可以监控所有 IO 的钩子。在VM级别或OS级别(我可以在linux和windows上运行,但我不允许运行wireshark,理论上它可能是文件IO)。

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

【问题讨论】:

    标签: java io trace


    【解决方案1】:

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

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

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

    要检查一般网络连接,请尝试“netstat”

    【讨论】:

      【解决方案2】:

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

      看起来对于更新版本的 Windows Process Monitor 是前进的方向。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我实际上是在使用 jprofiler 并看到 IO 正在以特定的方法发生,但仍然无法完全看到发生了什么。
        【解决方案4】:

        它很可能正忙于解析 WSDL、解析它、处理它等等......

        实际上,第一次,它也在处理所有的 spring 配置文件,其中包括为这些文件加载​​架构和验证等。

        你也可以运行类似wireshark的东西来跟踪所有的网络流量,看看它是否会得到任何东西。

        【讨论】:

        • 我正在从资源中加载 wsdl。但看起来你是对的。添加一点类加载,只是需要很多时间。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-08
          相关资源
          最近更新 更多