我想编写一个程序(最好用java)来解析和分析java堆转储文件(由jmap创建)。我知道有很多很棒的工具已经这样做了(jhat,eclipse的MAT,等等),但是我想从特定的角度分析堆到我的应用程序。
我在哪里可以阅读堆转储文件的结构,如何阅读它的示例等等?找不到任何有用的搜索...
非常感谢。
答案 0 :(得分:3)
以下是使用Eclipse版本完成的:Luna Service Release 1(4.4.1)和Eclipse Memory Analyzer V1.4.0
档案 - >新的 - >其他 - >插件项目
名称:MAT Extension
下一步
打开plugin.xml
@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将生成正确的“import”语句。 通过访问已打开的hprof文件顶部的工具栏的“Open Query Browser”,可以在MAT GUI中访问自定义查询。
可以用来从堆转储中提取数据的最重要的接口是ISnapshot。 ISnapshot表示堆转储,并提供各种方法从中读取对象和类,获取对象的大小等...
要获取ISnapshot的实例,可以在SnapshotFactory类上使用静态方法。但是,仅在使用API实现独立于Memory Analyzer的工具时才需要这样做。如果您正在编写MAT的扩展,那么您的编码将通过注入或作为方法参数获得与已打开的堆转储相对应的实例。
如果您希望程序生成常规报告,则可以使用名为ParseHeapDump的命令行实用程序与任何download of Eclipse's MAT tool一起使用。您将能够获得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
希望这是足以帮助您入门的信息。
答案 1 :(得分:0)
我不熟悉jhat,但Eclipse的MAT是开源的。他们的SVN link可用,或许你可以通过它来查看它们的解析器,甚至可以使用它。