笨死了啊 2024-02-19 16:29 采纳率: 0%
浏览 10

如何使用代码解析java dump(hprof)文件

我想知道线上环境中某个类中的Map的某个固定key值对应的value,所以在线上生成了dump文件拿到MAT中解析
但是由于Map中包含了几万个Entry,在mat工具上没有办法根据key值直接定位,所以在想是否能使用代码解析hprof文件,从里面读取内容直接转换成能查看Map信息

百度过程中看到有人使用eclipse mat的api取读取hprof文件,我自己仿写了一下(我运行在linux环境)

import org.eclipse.mat.snapshot.ISnapshot;
import org.eclipse.mat.snapshot.SnapshotFactory;
import org.eclipse.mat.util.ConsoleProgressListener;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Objects;

public class DumpTest {

    public static void main(String[] args) throws Exception {
        
        String hprofFile = "/root/Downloads/javaDump.hprof";
        ConsoleProgressListener listener = new ConsoleProgressListener(System.out);

        ISnapshot snapshot = SnapshotFactory.openSnapshot(new File(hprofFile), listener);
        snapshot.dispose();
        System.out.println();
    }
}

但是运行报错

Exception in thread "main" java.lang.ExceptionInInitializerError
    at DumpTest.main(DumpTest.java:27)
Caused by: java.lang.NullPointerException: Cannot invoke "org.eclipse.core.runtime.IExtensionRegistry.getExtensionPoint(String)" because the return value of "org.eclipse.core.runtime.Platform.getExtensionRegistry()" is null
    at org.eclipse.mat.snapshot.SnapshotFactory.<clinit>(SnapshotFactory.java:88)
    ... 1 more

Process finished with exit code 1

是否有人尝试过使用eclipse.mat的api读取dump文件成功的?或者其他方式也可以

  • 写回答

1条回答 默认 最新

  • &春风有信 2024-02-20 10:02
    关注

    从你提供的错误日志来看,问题似乎与Eclipse MAT API的初始化有关。Platform.getExtensionRegistry()返回null,这可能是因为Eclipse MAT API需要在Eclipse环境中运行,而你的代码似乎是在一个普通的Java环境中执行的。

    为了解决这个问题,你可以尝试以下步骤:

    确保Eclipse环境:首先,确保你的程序在Eclipse IDE中运行,或者在运行之前设置了Eclipse的运行环境。Eclipse MAT API是为Eclipse IDE设计的,可能需要Eclipse的某些组件来正常工作。
    添加依赖:确保你的项目中包含了所有必要的Eclipse MAT API的依赖。这可能包括Eclipse的某些插件或库。
    检查API版本:确保你使用的Eclipse MAT API版本与你的Eclipse IDE版本兼容。
    使用其他工具:如果你不需要Eclipse MAT的所有功能,只是想要解析hprof文件并提取特定的信息,你可以考虑使用其他工具或库。例如,jhat是Java JDK自带的一个工具,可以用来读取和分析hprof文件。你可以考虑使用jhat来解析hprof文件,然后编写代码来读取jhat生成的输出。
    自定义解析:如果上述方法都不适用,你还可以考虑自己编写代码来解析hprof文件。hprof文件本质上是一个二进制文件,你可以编写代码来读取文件并解析其中的数据。这需要一定的二进制文件解析知识,但可以实现更灵活和定制化的解析逻辑。

    无论你选择哪种方法,都需要对Java内存转储文件(hprof)的格式有一定的了解,以便正确地解析和提取所需的信息。希望这些信息能对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月19日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境