Apache Kato
Apache Kato 是将提供 JSR 326 参考实现的开源项目,用于分析 Sun 虚拟机生成的工件。代码库由 IBM 的 Diagnostic Tool Framework for Java (DTFJ) 提供支持(参见 参考资料)。作为开发中的项目,Kato 将适时成为一个功能全面的 Apache Software Foundation 项目。
Kato 并不是仅仅是一个参考实现。它还包含:
- Technology Compatibility Kit (TCK):其他 JVM 提供商可以使用这个测试套件检测它们与 JSR 326 的兼容性水平。
- Documentation:此 API 将可以作为 Javadoc 下载和浏览。
- Wiki:涵盖项目所有方面的 wiki。
- 示例工具:演示使用 API 时的最佳实践,项目将提供许多可下载的工具,用于解决实际问题。
诊断工具和使用它们的场景
分析后期工件的目的是确定问题的底层根源,或者提供关于虚拟机状态的视图。接下来,我们将介绍可用于执行此分析的工具,然后讨论一些常见场景并概述所涉及的问题。
Kato 的诊断工具将具备下面一些特征:
- 交互性和批处理:工具将采用交互的方式使用,比如是作为 GUI 使用,还是像批处理中的命令行接口(CLI)那样使用?
- 启动时间或处理时间:快速启动对工具更加重要,还是数据处理性能更加重要?
- 随机或串行存储:工具采用随机还是串行方式访问后期工件?
- 轻量级或重量级:工具将访问大量可用的数据,还是选择性与较少项目交互?
表 1 显示了 Apache Kato 项目将生成的工具,使用刚才定义的特征进行分类:
表 1. Kato 工具
工具类型或问题区域 | 交互性(GUI)或批处理(CLI) | 启动时间或处理时间 | 随机或串行存取 | 轻量级或重量级 |
---|---|---|---|---|
Java Debug Interface 连接器(例如,使用 Eclipse 调试工件) | 交互性 | 启动 | 随机 | 轻量级 |
工件管理器 | 交互性 | 启动 | 随机 | 轻量级 |
本机内存分析 | 批处理 | 处理 | 串行 | 重量级 |
趋势分析 | 批处理 | 启动 | 随机 | 重量级 |
用于检测潜在问题的工件分析器 | 批处理 | 处理 | 串行 | 重量级 |
Java 堆分析器 | 交互性 | 启动 | 串行 | 重量级 |
工件管理器
您可以使用工件管理器查看后期工件的内容。一个常见的实现就是 GUI 工具在左侧以树型结构显示工件内容,并通过一些面板在右侧显示详细信息。您还可以使用管理器定位或搜索工件中的已知项目。管理器应该是轻量级的,因为它只能处理直接响应用户输入的项目,而不是迭代工件中的所有项目。管理器还应提供以下功能:
- 数据类型规范:能够通知 UI 将特定地址的数据显示为具体的数据类型。例如,此地址表示以 null 结尾的字符串的开始。
- 数据覆盖:将包含在转储中的字节值覆盖为用户定义的值,并让 UI 使用更新后的值。这表示您将能够通过指定正确的值来修复损坏的结构或列表。然后,您应该能够根据需要保存和重新加载这些覆盖值。
- 自动确定工件类型。
- 通过管理器启动其他工具。这可以是直接启动工具,或者带一组在当前管理器上下文中有用的命令行选项。举例来说,如果管理器显示堆占用了很大的空间,则您可以启动 工件分析器 来执行堆占用空间分析。
本机内存分析
过去,Java 开发人员不需要担心本机内存;事实上,JVM 的一个优势便是能帮助您解决此问题。但是现在本机内存的问题又重新成为了讨论的焦点(参见 参考资料)。最开始,本机内存的使用是相对比较简单的,因为您会在某个时候通过 Java Native Interface (JNI) 调用访问 JVM 外部的一些功能。这可以是您自己通过 JNI 发起的直接调用,或是编写到拥有良好定义的 JNI 链接的规范中的直接调用,比如 JVM Tool Interface (JVMTI)。随着 Java 5 和 java.nio 包(以及子包)的引入,本机内存作为该包提供的缓冲的底层存储使用。这很容易导致程序中拥有大量空闲 Java 堆,但会由于本机内存耗尽而抛出内存不足异常。这意味着,本机内存分析工具正在变得越重要,并且需要受 JSR 326 支持。这种工具的应用包括能够: