/*
 * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package sun.management;

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.MemoryUsage;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.TabularType;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenDataException;
import com.sun.management.GcInfo;

Helper class to build composite data.
/** * Helper class to build composite data. */
public class GcInfoBuilder { private final GarbageCollectorMXBean gc; private final String[] poolNames; private String[] allItemNames; // GC-specific composite type: // Each GarbageCollectorMXBean may have different GC-specific attributes // the CompositeType for the GcInfo could be different. private CompositeType gcInfoCompositeType; // GC-specific items private final int gcExtItemCount; private final String[] gcExtItemNames; private final String[] gcExtItemDescs; private final char[] gcExtItemTypes; GcInfoBuilder(GarbageCollectorMXBean gc, String[] poolNames) { this.gc = gc; this.poolNames = poolNames; this.gcExtItemCount = getNumGcExtAttributes(gc); this.gcExtItemNames = new String[gcExtItemCount]; this.gcExtItemDescs = new String[gcExtItemCount]; this.gcExtItemTypes = new char[gcExtItemCount]; // Fill the information about extension attributes fillGcAttributeInfo(gc, gcExtItemCount, gcExtItemNames, gcExtItemTypes, gcExtItemDescs); // lazily build the CompositeType for the GcInfo // including the GC-specific extension attributes this.gcInfoCompositeType = null; } GcInfo getLastGcInfo() { MemoryUsage[] usageBeforeGC = new MemoryUsage[poolNames.length]; MemoryUsage[] usageAfterGC = new MemoryUsage[poolNames.length]; Object[] values = new Object[gcExtItemCount]; return getLastGcInfo0(gc, gcExtItemCount, values, gcExtItemTypes, usageBeforeGC, usageAfterGC); } public String[] getPoolNames() { return poolNames; } int getGcExtItemCount() { return gcExtItemCount; } // Returns the CompositeType for the GcInfo including // the extension attributes synchronized CompositeType getGcInfoCompositeType() { if (gcInfoCompositeType != null) return gcInfoCompositeType; // First, fill with the attributes in the GcInfo String[] gcInfoItemNames = GcInfoCompositeData.getBaseGcInfoItemNames(); OpenType[] gcInfoItemTypes = GcInfoCompositeData.getBaseGcInfoItemTypes(); int numGcInfoItems = gcInfoItemNames.length; int itemCount = numGcInfoItems + gcExtItemCount; allItemNames = new String[itemCount]; String[] allItemDescs = new String[itemCount]; OpenType<?>[] allItemTypes = new OpenType<?>[itemCount]; System.arraycopy(gcInfoItemNames, 0, allItemNames, 0, numGcInfoItems); System.arraycopy(gcInfoItemNames, 0, allItemDescs, 0, numGcInfoItems); System.arraycopy(gcInfoItemTypes, 0, allItemTypes, 0, numGcInfoItems); // Then fill with the extension GC-specific attributes, if any. if (gcExtItemCount > 0) { fillGcAttributeInfo(gc, gcExtItemCount, gcExtItemNames, gcExtItemTypes, gcExtItemDescs); System.arraycopy(gcExtItemNames, 0, allItemNames, numGcInfoItems, gcExtItemCount); System.arraycopy(gcExtItemDescs, 0, allItemDescs, numGcInfoItems, gcExtItemCount); for (int i = numGcInfoItems, j = 0; j < gcExtItemCount; i++, j++) { switch (gcExtItemTypes[j]) { case 'Z': allItemTypes[i] = SimpleType.BOOLEAN; break; case 'B': allItemTypes[i] = SimpleType.BYTE; break; case 'C': allItemTypes[i] = SimpleType.CHARACTER; break; case 'S': allItemTypes[i] = SimpleType.SHORT; break; case 'I': allItemTypes[i] = SimpleType.INTEGER; break; case 'J': allItemTypes[i] = SimpleType.LONG; break; case 'F': allItemTypes[i] = SimpleType.FLOAT; break; case 'D': allItemTypes[i] = SimpleType.DOUBLE; break; default: throw new AssertionError( "Unsupported type [" + gcExtItemTypes[i] + "]"); } } } CompositeType gict = null; try { final String typeName = "sun.management." + gc.getName() + ".GcInfoCompositeType"; gict = new CompositeType(typeName, "CompositeType for GC info for " + gc.getName(), allItemNames, allItemDescs, allItemTypes); } catch (OpenDataException e) { // shouldn't reach here throw Util.newException(e); } gcInfoCompositeType = gict; return gcInfoCompositeType; } synchronized String[] getItemNames() { if (allItemNames == null) { // initialize when forming the composite type getGcInfoCompositeType(); } return allItemNames; } // Retrieve information about extension attributes private native int getNumGcExtAttributes(GarbageCollectorMXBean gc); private native void fillGcAttributeInfo(GarbageCollectorMXBean gc, int numAttributes, String[] attributeNames, char[] types, String[] descriptions);
Returns the last GcInfo
Params:
  • gc – GarbageCollectorMXBean that the gc info is associated with.
  • numExtAtts – number of extension attributes
  • extAttValues – Values of extension attributes to be filled.
  • before – Memory usage before GC to be filled.
  • after – Memory usage after GC to be filled.
/** * Returns the last GcInfo * * @param gc GarbageCollectorMXBean that the gc info is associated with. * @param numExtAtts number of extension attributes * @param extAttValues Values of extension attributes to be filled. * @param before Memory usage before GC to be filled. * @param after Memory usage after GC to be filled. */
private native GcInfo getLastGcInfo0(GarbageCollectorMXBean gc, int numExtAtts, Object[] extAttValues, char[] extAttTypes, MemoryUsage[] before, MemoryUsage[] after); }