我想写一个程序(最好是在java中),它将解析和分析一个java堆转储文件(由jmap创建)。我知道有很多很棒的工具已经这样做了(jhat,eclipse的MAT,等等),但是我想从一个特定的角度来分析堆到我的应用程序。
我在哪里可以阅读堆转储文件的结构,示例如何阅读它,等等?没有找到任何有用的搜索...
非常感谢。
我不熟悉jhat,但Eclipse的MAT是开源的。他们的SVN链接是可用的,也许你可以查看他们的解析器,甚至可以使用它。
以下是使用Eclipse版本完成的:Luna服务版本1(4.4.1)和Eclipse内存分析器版本1.4.0
>
文件-
名称:MAT扩展
下一个
打开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将生成正确的“导入”语句。通过访问已打开的hprof文件顶部的工具栏“打开查询浏览器”,可以在MAT GUI中访问自定义查询。
可以用来从堆转储中提取数据的最重要接口是ISnapshot。ISnapshot表示堆转储,并提供各种方法从中读取对象和类,获取对象的大小等…
要获得ISnapshot的实例,可以在SnapshotFactory类上使用静态方法。但是,只有当API用于实现独立于Memory Analyzer的工具时才需要这样做。如果您正在向MAT编写扩展,那么您的编码将通过注入或作为方法参数获得与已经打开的堆转储相对应的实例。
参考
如果你想让一个程序生成通常的报告,有一个名为ParseHeapDump的命令行实用程序,可以下载Eclipse的MAT工具。你可以得到所有信息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
希望这些信息足够让你开始学习。
问题内容: 我想编写一个程序(最好在Java中),以分析和分析Java堆转储文件(由jmap创建)。我知道已经有很多很棒的工具(jhat,eclipse的MAT等),但是我想从特定的角度分析应用程序中的堆。 在哪里可以阅读有关堆转储文件的结构,如何读取该文件的示例等?找不到有用的搜索内容… 非常感谢。 问题答案: 我不熟悉jhat,但是Eclipse的MAT是开源的。他们的SVN链接可用,也许您可
问题内容: 我需要以编程方式计算给定jar文件中已编译类,接口和枚举的数量(因此我需要三个单独的数字)。哪个API对我有帮助?(我不能使用第三方库。) 我已经尝试过非常棘手的方案,这似乎并不总是正确的。即,我将每个ZipEntry读入byte [],然后将结果提供给我的自定义类加载器,该加载器扩展了标准CalssLoader并将此byte []发送到ClassLoader.defineClass(
为了以编程方式分析。java文件,我刚刚开始玩Soot。从我所读到的内容来看,Soot似乎是一个非常强大的源代码分析工具,但我在网上找到的大多数材料都是将其用作命令行工具。 我需要以编程方式从给定目录中的。java文件加载类,构造程序依赖图(PDG)并进行一些程序切片。我仍然不确定是否Soot提供切片,但我可以实现自己一旦我有PDG。 为了开始,我尝试使用下面的代码: 然而,它不起作用。它在调用中
在我的工作中,我们遇到了一个很难再现OOM的问题。或者,更准确地说,它很容易在一个系统上复制,使该系统无法使用,但在其他任何地方复制都很困难,给定相同的输入。 应用程序正在使用服务包装器作为服务运行。我们确实通过在OOM上输出堆转储文件的选项更改了配置以启动它,但不幸的是,它们被截断了,很可能是由于服务包装器在写入文件时超时并终止了进程。这是显而易见的,因为最大内存被设置为1GB,hprof文件小
Eclipse memory analyzer拒绝打开文件,我不确定应该使用哪个工具,或者应用哪个转换才能使它们与MAT一起工作。 不幸的是,到目前为止,我对这个问题的搜索结果被基本教程所污染,即“如何打开。heapdump文件”从本质上得到了“如何分析堆转储”的结果。 从下面的评论中编辑 使用VisualVM打开→不允许打开文件 使用JHat打开→抱怨神奇的数字(显然需要另一种二进制格式,可能是
我正在经历内存泄漏,这里有一些细节。 在泄漏后, null null 我很惊讶顶部、堆转储大小和实际堆大小之间的差异。我猜测top和heap之间的区别是垃圾收集器堆和本地堆区域的可能性。但是,为什么堆转储文件大小和实际堆大小(来自eclipse MAT analyzer)会不同呢? 对这个问题有什么见解吗? 更新/回答 一些建议是使用jcmd(https://docs.oracle.com/jav