alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

JMeter example source code file (HeapDumper.java)

This example JMeter source code file (HeapDumper.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - JMeter tags/keywords

date, exception, exception, file, file, heapdumper, heapdumper, io, malformedobjectnameexception, management, objectname, see, simpledateformat, string, string, text, throwable, util

The JMeter HeapDumper.java source code

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package org.apache.jorphan.util;

import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.RuntimeMBeanException;

/**
 * Class allowing access to Sun's heapDump method (Java 1.6+).
 * Uses Reflection so that the code compiles on Java 1.5.
 * The code will only work on Sun Java 1.6+.
 */
public class HeapDumper {

    // SingletonHolder idiom for lazy initialisation
    private static class DumperHolder {
        private static final HeapDumper DUMPER = new HeapDumper();
    }

    private static HeapDumper getInstance(){
        return DumperHolder.DUMPER;
    }

    // This is the name of the HotSpot Diagnostic platform MBean (Sun Java 1.6)
    // See: http://java.sun.com/javase/6/docs/jre/api/management/extension/com/sun/management/HotSpotDiagnosticMXBean.html
    private static final String HOTSPOT_BEAN_NAME =
         "com.sun.management:type=HotSpotDiagnostic";

    private static final SimpleDateFormat TIME_STAMP_FORMAT = new SimpleDateFormat("yyyyMMdd_hhmmss_SSS");

    // These are needed for invoking the method
    private final MBeanServer server;
    private final ObjectName hotspotDiagnosticBean;

    // If we could not find the method, store the exception here
    private final Exception exception;

    // Only invoked by IODH class
    private HeapDumper() {
        server = ManagementFactory.getPlatformMBeanServer(); // get the platform beans
        ObjectName on = null;
        Exception ex = null;
        try {
            on = new ObjectName(HOTSPOT_BEAN_NAME); // should never fail
            server.getObjectInstance(on); // See if we can actually find the object
        } catch (MalformedObjectNameException e) { // Should never happen
            throw new AssertionError("Could not establish the HotSpotDiagnostic Bean Name: "+e);
        } catch (InstanceNotFoundException e) {
            ex = e;
            on = null; // Prevent useless dump attempts
        }
        exception = ex;
        hotspotDiagnosticBean = on;
    }

    /**
     * Initialise the dumper, and report if there is a problem.
     * This is optional, as the dump methods will initialise if necessary.
     *
     * @throws Exception if there is a problem finding the heapDump MXBean
     */
    public static void init() throws Exception {
        Exception e =getInstance().exception;
        if (e != null) {
            throw e;
        }
    }

    /**
     * Dumps the heap to the outputFile file in the same format as the hprof heap dump.
     * <p>
     * Calls the dumpHeap() method of the HotSpotDiagnostic MXBean, if available.
     * <p>
     * See
     * <a href="http://java.sun.com/javase/6/docs/jre/api/management/extension/com/sun/management/HotSpotDiagnosticMXBean.html">
     * HotSpotDiagnosticMXBean
     * </a>
     * @param fileName name of the heap dump file. Must be creatable, i.e. must not exist.
     * @param live if true, dump only the live objects
     * @throws Exception if the MXBean cannot be found, or if there is a problem during invocation
     */
    public static void dumpHeap(String fileName, boolean live) throws Exception{
        getInstance().dumpHeap0(fileName, live);
    }

    /**
     * Dumps live objects from the heap to the outputFile file in the same format as the hprof heap dump.
     * <p>
     * @see #dumpHeap(String, boolean)
     * @param fileName name of the heap dump file. Must be creatable, i.e. must not exist.
     * @throws Exception if the MXBean cannot be found, or if there is a problem during invocation
     */
    public static void dumpHeap(String fileName) throws Exception{
        dumpHeap(fileName, true);
    }

    /**
     * Dumps live objects from the heap to the outputFile file in the same format as the hprof heap dump.
     * <p>
     * Creates the dump using the file name: dump_yyyyMMdd_hhmmss_SSS.hprof
     * The dump is created in the current directory.
     * <p>
     * @see #dumpHeap(boolean)
     * @return the name of the dump file that was created
     * @throws IOException
     * @throws Exception if the MXBean cannot be found, or if there is a problem during invocation
     */
    public static String dumpHeap() throws Exception{
        return dumpHeap(true);
    }

    /**
     * Dumps objects from the heap to the outputFile file in the same format as the hprof heap dump.
     * <p>
     * Creates the dump using the file name: dump_yyyyMMdd_hhmmss_SSS.hprof
     * The dump is created in the current directory.
     * <p>
     * @see #dumpHeap(String, boolean)
     * @param live true id only live objects are to be dumped.
     *
     * @return the name of the dump file that was created
     * @throws IOException
     * @throws Exception if the MXBean cannot be found, or if there is a problem during invocation
     */
    public static String dumpHeap(boolean live) throws Exception {
        return dumpHeap(new File("."), live);
    }

    /**
     * Dumps objects from the heap to the outputFile file in the same format as the hprof heap dump.
     * The dump is created in the specified directory.
     * <p>
     * Creates the dump using the file name: dump_yyyyMMdd_hhmmss_SSS.hprof
     * <p>
     * @see #dumpHeap(String, boolean)
     * @param basedir File object for the target base directory.
     * @param live true id only live objects are to be dumped.
     *
     * @return the name of the dump file that was created
     * @throws IOException
     * @throws Exception if the MXBean cannot be found, or if there is a problem during invocation
     */
    public static String dumpHeap(File basedir, boolean live) throws Exception {
        String stamp = TIME_STAMP_FORMAT.format(new Date());
        File temp = new File(basedir,"dump_"+stamp+".hprof");
        final String path = temp.getPath();
        dumpHeap(path, live);
        return path;
    }

    /**
     * Perform the dump using the dumpHeap method.
     *
     * @param fileName the file to use
     * @param live true to dump only live objects
     * @throws Exception if the MXBean cannot be found, or if there is a problem during invocation
     */
    private void dumpHeap0(String fileName, boolean live) throws Exception {
        try {
            if (exception == null) {
                server.invoke(hotspotDiagnosticBean,
                        "dumpHeap",
                        new Object[]{fileName, Boolean.valueOf(live)},
                        new String[]{"java.lang.String", "boolean"});
            } else {
                throw exception;
            }
        } catch (RuntimeMBeanException e) {
            Throwable f = e.getCause();
            if (f instanceof Exception){
                throw (Exception )f;
            }
            throw(e);
        } catch (MBeanException e) {
            Throwable f = e.getCause();
            if (f instanceof Exception){
                throw (Exception )f;
            }
            throw(e);
        }
    }
}

Other JMeter examples (source code examples)

Here is a short list of links related to this JMeter HeapDumper.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.