一种从 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);
有没有办法从 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);