一种从 JVM 内存中获取所有对象实例的方法

A way to get all objects instances from JVM memory

有没有办法从 JVM 内存中获取所有对象实例并在文件中打印它的 toString() 表示形式?

我需要在出现错误时拍摄我所有应用程序的对象实例。

我认为转储不是我要找的东西,因为它没有给我关于当时内存中包含哪些实例的准确信息,只有静态信息。

您要求的实质上称为堆转储。

Heapdump 是给定时间内 JVM 内存的快照,它包含有关所有对象的信息。

要捕获它,您可以这样做

jmap -dump:format=b,file=heap.bin <pid>
  • pid:Java进程的id

有几种工具可以分析输出的文件。好的变化是您的 IDE 可以做到,这样您就可以在熟悉的界面中查看它。

这里有更多 https://dzone.com/articles/java-heap-dump-analyzer-1

要以编程方式触发 hepdump,您可以这样做

public class HeapDumper {
    
    private static final String HOTSPOT_BEAN_NAME =
        "com.sun.management:type=HotSpotDiagnostic";
    private static volatile HotSpotDiagnosticMXBean hotspotMBean;

    static void dumpHeap(String fileName, boolean live) {
        initHotspotMBean();
        try {
            hotspotMBean.dumpHeap(fileName, live);
        } catch (RuntimeException re) {
            throw re;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }

    private static void initHotspotMBean() {
        if (hotspotMBean == null) {
            synchronized (HeapDumper.class) {
                if (hotspotMBean == null) {
                    hotspotMBean = getHotspotMBean();
                }
            }
        }
    }
    
    private static HotSpotDiagnosticMXBean getHotspotMBean() {
        try {
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            HotSpotDiagnosticMXBean bean =
                ManagementFactory.newPlatformMXBeanProxy(server,
                                                         HOTSPOT_BEAN_NAME, HotSpotDiagnosticMXBean.class);
            return bean;
        } catch (RuntimeException re) {
            throw re;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }
}

这样触发


String fileName = "heap.bin";
boolean live = true; // only reachable object - true, all objects - false
dumpHeap(fileName, live);