4

我想编写一个程序(最好在java中),它将解析和分析java堆转储文件(由jmap创建)。我知道有很多很棒的工具已经这样做了(jhat、eclipse 的 MAT 等等),但我想从特定的角度分析堆到我的应用程序。

我在哪里可以阅读有关堆转储文件的结构、如何阅读它的示例等信息?没有找到任何有用的搜索它...

非常感谢。

4

2 回答 2

3

以下是使用 Eclipse 版本完成的:Luna Service Release 1 (4.4.1) 和 Eclipse Memory Analyzer Version 1.4.0

以编程方式与 Java 堆转储接口

环境设置

  1. 在eclipse中,Help -> Install New Software -> install Eclipse Plug-in Development Environment
  2. 在eclipse中,Window -> Preferences -> Plug-in Development -> Target Platform -> Add
  3. 无 -> 位置 -> 添加 -> 安装
  4. 名称 = 垫
  5. 位置 = /path/to/MAT/installation/mat

项目设置

  1. 文件 -> 新建 -> 其他 -> 插件项目

    名称:垫扩展

  2. 下一个

    • 禁用激活器
    • 禁用对 UI 的贡献
    • 禁用 API 分析
  3. 下一个
    • 禁用模板
  4. 结束

代码生成

打开插件.xml

  1. 依赖项 -> 添加
    • 选择 org.eclipse.mat.api
  2. 扩展 -> 添加
    • 选择 org.eclipse.mat.report.query
  3. 右键单击report.query -> 新建
    • 名称:MyQuery
    • 点击“impl”生成类

实施 IQuery

@CommandName("MyQuery") //for the command line interface
@Name("My Query") //display name for the GUI
@Category("Custom Queries") //list this Query will be put under in the GUI
@Help("This is my first query.") //help displayed
public class MyQuery implements IQuery
{
     public MyQuery{}

     @Argument //snapshot will be populated before the call to execute happens
     public ISnapshot snapshot;

     /*
      * execute : only method overridden from IQuery
      *           Prints out "My first query." to the output file.
     */
     @Override
     public IResult execute(IProgressListener arg0) throws Exception
     {
            CharArrayWriter outWriter = new CharArrayWriter(100);
            PrintWriter out = new PrintWriter(outWriter);
            SnapshotInfo snapshotInfo = snapshot.getSnapshotInfo();
            out.println("Used Heap Size: " + snapshotInfo.getUsedHeapSize());
            out.println("My first query.")
            return new TextResult(outWriter.toString(), false);
     }
}

ctrl+shift+o 将生成正确的“导入”语句。通过访问您打开的 hprof 文件顶部的工具栏的“打开查询浏览器”,可以在 MAT GUI 中访问自定义查询。

ISnapshot 接口

可用于从堆转储中提取数据的最重要接口是 ISnapshot。ISnapshot 表示堆转储,并提供各种方法来从中读取对象和类、获取对象的大小等……</p>

要获得 ISnapshot 的实例,可以使用 SnapshotFactory 类的静态方法。但是,仅当 API 用于实现独立于 Memory Analyzer 的工具时才需要这样做。如果您正在为 MAT 编写扩展,那么您的编码将通过注入或作为方法参数获得与已打开的堆转储相对应的实例。

参考

内置命令行实用程序

如果您希望让程序生成通常的报告,那么可以在任何下载 Eclipse 的 MAT 工具时使用名为 ParseHeapDump 的命令行实用程序。您将能够获得所有信息 MAT 存储的有用 html 转储。

> ParseHeapDump <heap dump> org.eclipse.mat.api:suspects org.eclipse.mat.api:top_components org.eclipse.mat.api:overview #will dump out all general reports available through MAT

希望这是足够的信息来帮助您入门。

于 2014-12-10T00:16:39.923 回答
0

我不熟悉 jhat,但 Eclipse 的 MAT 是开源的。他们的SVN 链接可用,也许您可​​以查看他们的解析器,甚至可以使用它。

于 2012-06-20T20:32:40.197 回答