一.需求
有时候web应用经常会发生FGC,我们想知道FGC把那些对象给回收了,思路很简单就是看看FGC之前内存中有那些实例,FGC之后内存中又有那些实例,通过前后的比较,我们就能很容易知道FGC回收了那些实例,当然我们可以手工去dump内存,在FGC发生之前dump一下内存,再在FGC发生之后dump一下内存,但是这dump的时间点不好把握,能否让JVM自动去dump就更好了。
二.手工dump内存的方法
jmap -dump:format=b,file=/home/admin/xxx.bin PID
其中PID是java的进程ID
三.让JVM自己dump内存
在JVM启动的时候增加下面两个参数
-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC就可以在FGC的前后dump一下内存。不过增加这两个参数会在每次FGC的时候dump内存,dump内存本身对应用有影响,但是不会导致JVM停机。特别是在web应用启动的时候,就会不断的去dump内存,因为web应用启动的时候会频繁发生FGC。
四.使用Java代码来dump内存
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import com.sun.management.HotSpotDiagnosticMXBean;
public class HeapDumper {
// This is the name of the HotSpot Diagnostic MBean
private static final String HOTSPOT_BEAN_NAME =
"com.sun.management:type=HotSpotDiagnostic";
// field to store the hotspot diagnostic MBean
private static volatile HotSpotDiagnosticMXBean hotspotMBean;
/*
* Call this method from your application whenever you
* want to dump the heap snapshot into a file.
*
* @param fileName name of the heap dump file
* @param live flag that tells whether to dump
* only the live objects
*/
static void dumpHeap(String fileName, boolean live) {
// initialize hotspot diagnostic MBean
initHotspotMBean();
try {
hotspotMBean.dumpHeap(fileName, live);
} catch (RuntimeException re) {
throw re;
} catch (Exception exp) {
throw new RuntimeException(exp);
}
}
// initialize the hotspot diagnostic MBean field
private static void initHotspotMBean() {
if (hotspotMBean == null) {
synchronized (HeapDumper.class) {
if (hotspotMBean == null) {
hotspotMBean = getHotspotMBean();
}
}
}
}
// get the hotspot diagnostic MBean from the
// platform MBean server
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);
}
}
public static void main(String[] args) {
// default heap dump file name
String fileName = "heap.bin";
// by default dump only the live objects
boolean live = true;
// simple command line options
switch (args.length) {
case 2:
live = args[1].equals("true");
case 1:
fileName = args[0];
}
// dump the heap
dumpHeap(fileName, live);
}
}
分享到:
相关推荐
在程序运行过程中,经常会出现各种各样的问题,例如性能瓶颈、内存泄漏、死锁等。为了快速定位并解决问题,我们需要收集多种类型的运行时信息,包括但不限于系统日志、堆转储文件(heap dump)、线程转储文件...
Minor GC(YGC)和Full GC(FGC)的发生时机也不同。当新生代内存不足时,会触发Minor GC;而当JVM内存不足时,则会触发Full GC。Full GC是对整个堆进行的垃圾回收,会造成较长时间的服务停顿。 为了在面试中更好地...
此外,Jmap还可以生成堆内存的dump文件(`jmap -dump:format=b,file=<filename> [pid]`),这对于分析内存泄漏和大对象问题非常有用。 4. **Jstack**: Jstack用于生成Java线程的堆栈跟踪,这对于诊断死锁和其他...
- 可视化地显示JVM内存使用情况、CPU使用率等。 - 支持远程监控。 ##### 8. jconsole:Java监控与管理控制台 - **功能介绍**:`jconsole`是JDK自带的一个GUI工具,用于监控JVM的运行状态。 - **主要功能**: - ...
- `-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/jvmdump/jvm.bin`: 在发生内存溢出时生成堆转储文件。 - `-XX:+UseConcMarkSweepGC -XX:+UseParNewGC`: 配置CMS(Concurrent Mark Sweep)收集器和...
- 手动触发垃圾收集(FGC):`jcmd <pid> GC.run`(注:生产环境中避免在高峰期手动GC) - 通过Arthas监控仪表盘观察内存使用率变化,以判断内存泄漏风险。 2. **分析堆内存中对象**: - 使用`jmap -histo <pid>...
通过`jmap -histo <pid>` 可以获得对象实例直方图,这有助于了解不同类型的对象在内存中的分布情况。另外,`jmap -dump:format=b,file=<filename> <pid>` 命令可以导出整个堆快照到文件中,便于后续分析。 #### 2. ...