首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

在JVM发作FGC前后dump内存

2013-11-29 
在JVM发生FGC前后dump内存一.需求有时候web应用经常会发生FGC,我们想知道FGC把那些对象给回收了,思路很简

在JVM发生FGC前后dump内存
一.需求

有时候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);    }}

热点排行