| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
package sun.management.snmp.jvminstr;  | 
 | 
 | 
 | 
// jmx imports  | 
 | 
 | 
 | 
import javax.management.MBeanServer;  | 
 | 
import com.sun.jmx.snmp.SnmpStatusException;  | 
 | 
import com.sun.jmx.snmp.SnmpDefinitions;  | 
 | 
 | 
 | 
// jdmk imports  | 
 | 
 | 
 | 
import com.sun.jmx.snmp.agent.SnmpMib;  | 
 | 
 | 
 | 
import java.util.Map;  | 
 | 
import java.lang.management.ManagementFactory;  | 
 | 
import java.lang.management.MemoryUsage;  | 
 | 
import java.lang.management.MemoryType;  | 
 | 
import java.lang.management.MemoryMXBean;  | 
 | 
import javax.management.openmbean.CompositeData;  | 
 | 
 | 
 | 
import sun.management.snmp.jvmmib.JvmMemoryMBean;  | 
 | 
import sun.management.snmp.jvmmib.EnumJvmMemoryGCCall;  | 
 | 
import sun.management.snmp.jvmmib.EnumJvmMemoryGCVerboseLevel;  | 
 | 
import sun.management.snmp.util.MibLogger;  | 
 | 
import sun.management.snmp.util.JvmContextFactory;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class JvmMemoryImpl implements JvmMemoryMBean { | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    final static EnumJvmMemoryGCCall JvmMemoryGCCallSupported  | 
 | 
        = new EnumJvmMemoryGCCall("supported"); | 
 | 
    final static EnumJvmMemoryGCCall JvmMemoryGCCallStart  | 
 | 
        = new EnumJvmMemoryGCCall("start"); | 
 | 
    final static EnumJvmMemoryGCCall JvmMemoryGCCallFailed  | 
 | 
        = new EnumJvmMemoryGCCall("failed"); | 
 | 
    final static EnumJvmMemoryGCCall JvmMemoryGCCallStarted  | 
 | 
        = new EnumJvmMemoryGCCall("started"); | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    final static EnumJvmMemoryGCVerboseLevel JvmMemoryGCVerboseLevelVerbose =  | 
 | 
        new EnumJvmMemoryGCVerboseLevel("verbose"); | 
 | 
    final static EnumJvmMemoryGCVerboseLevel JvmMemoryGCVerboseLevelSilent =  | 
 | 
        new EnumJvmMemoryGCVerboseLevel("silent"); | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public JvmMemoryImpl(SnmpMib myMib) { | 
 | 
    }  | 
 | 
 | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public JvmMemoryImpl(SnmpMib myMib, MBeanServer server) { | 
 | 
        // no entry will be registered since the table is virtual.  | 
 | 
    }  | 
 | 
 | 
 | 
    final static String heapMemoryTag = "jvmMemory.getHeapMemoryUsage";  | 
 | 
    final static String nonHeapMemoryTag = "jvmMemory.getNonHeapMemoryUsage";  | 
 | 
 | 
 | 
    private MemoryUsage getMemoryUsage(MemoryType type) { | 
 | 
        if (type == MemoryType.HEAP) { | 
 | 
            return ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();  | 
 | 
        } else { | 
 | 
            return ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    MemoryUsage getNonHeapMemoryUsage() { | 
 | 
        try { | 
 | 
            final Map<Object, Object> m = JvmContextFactory.getUserData();  | 
 | 
 | 
 | 
            if (m != null) { | 
 | 
                final MemoryUsage cached = (MemoryUsage)  | 
 | 
                    m.get(nonHeapMemoryTag);  | 
 | 
                if (cached != null) { | 
 | 
                    log.debug("getNonHeapMemoryUsage", | 
 | 
                          "jvmMemory.getNonHeapMemoryUsage found in cache.");  | 
 | 
                    return cached;  | 
 | 
                }  | 
 | 
 | 
 | 
                final MemoryUsage u = getMemoryUsage(MemoryType.NON_HEAP);  | 
 | 
 | 
 | 
                //  getNonHeapMemoryUsage() never returns null.  | 
 | 
                //  | 
 | 
                // if (u == null) u=MemoryUsage.INVALID;  | 
 | 
 | 
 | 
                m.put(nonHeapMemoryTag,u);  | 
 | 
                return u;  | 
 | 
            }  | 
 | 
            // Should never come here.  | 
 | 
              | 
 | 
            log.trace("getNonHeapMemoryUsage", | 
 | 
                      "ERROR: should never come here!");  | 
 | 
            return getMemoryUsage(MemoryType.NON_HEAP);  | 
 | 
        } catch (RuntimeException x) { | 
 | 
            log.trace("getNonHeapMemoryUsage", | 
 | 
                  "Failed to get NonHeapMemoryUsage: " + x);  | 
 | 
            log.debug("getNonHeapMemoryUsage",x); | 
 | 
            throw x;  | 
 | 
        }  | 
 | 
 | 
 | 
    }  | 
 | 
 | 
 | 
    MemoryUsage getHeapMemoryUsage() { | 
 | 
        try { | 
 | 
            final Map<Object, Object> m = JvmContextFactory.getUserData();  | 
 | 
 | 
 | 
            if (m != null) { | 
 | 
                final MemoryUsage cached = (MemoryUsage)m.get(heapMemoryTag);  | 
 | 
                if (cached != null) { | 
 | 
                    log.debug("getHeapMemoryUsage", | 
 | 
                          "jvmMemory.getHeapMemoryUsage found in cache.");  | 
 | 
                    return cached;  | 
 | 
                }  | 
 | 
 | 
 | 
                final MemoryUsage u = getMemoryUsage(MemoryType.HEAP);  | 
 | 
 | 
 | 
                // getHeapMemoryUsage() never returns null.  | 
 | 
                //  | 
 | 
                // if (u == null) u=MemoryUsage.INVALID;  | 
 | 
 | 
 | 
                m.put(heapMemoryTag,u);  | 
 | 
                return u;  | 
 | 
            }  | 
 | 
 | 
 | 
            // Should never come here.  | 
 | 
              | 
 | 
            log.trace("getHeapMemoryUsage", "ERROR: should never come here!"); | 
 | 
            return getMemoryUsage(MemoryType.HEAP);  | 
 | 
        } catch (RuntimeException x) { | 
 | 
            log.trace("getHeapMemoryUsage", | 
 | 
                  "Failed to get HeapMemoryUsage: " + x);  | 
 | 
            log.debug("getHeapMemoryUsage",x); | 
 | 
            throw x;  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    static final Long Long0 = new Long(0);  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryNonHeapMaxSize()  | 
 | 
        throws SnmpStatusException { | 
 | 
        final long val = getNonHeapMemoryUsage().getMax();  | 
 | 
        if (val > -1) return  new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryNonHeapCommitted() throws SnmpStatusException { | 
 | 
        final long val = getNonHeapMemoryUsage().getCommitted();  | 
 | 
        if (val > -1) return new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryNonHeapUsed() throws SnmpStatusException { | 
 | 
        final long val = getNonHeapMemoryUsage().getUsed();  | 
 | 
        if (val > -1) return new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryNonHeapInitSize() throws SnmpStatusException { | 
 | 
        final long val = getNonHeapMemoryUsage().getInit();  | 
 | 
        if (val > -1) return new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryHeapMaxSize() throws SnmpStatusException { | 
 | 
        final long val = getHeapMemoryUsage().getMax();  | 
 | 
        if (val > -1) return new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public EnumJvmMemoryGCCall getJvmMemoryGCCall()  | 
 | 
        throws SnmpStatusException { | 
 | 
        final Map<Object,Object> m = JvmContextFactory.getUserData();  | 
 | 
 | 
 | 
        if (m != null) { | 
 | 
            final EnumJvmMemoryGCCall cached  | 
 | 
                = (EnumJvmMemoryGCCall) m.get("jvmMemory.getJvmMemoryGCCall"); | 
 | 
            if (cached != null) return cached;  | 
 | 
        }  | 
 | 
        return JvmMemoryGCCallSupported;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public void setJvmMemoryGCCall(EnumJvmMemoryGCCall x)  | 
 | 
        throws SnmpStatusException { | 
 | 
        if (x.intValue() == JvmMemoryGCCallStart.intValue()) { | 
 | 
            final Map<Object, Object> m = JvmContextFactory.getUserData();  | 
 | 
 | 
 | 
            try { | 
 | 
                ManagementFactory.getMemoryMXBean().gc();  | 
 | 
                if (m != null) m.put("jvmMemory.getJvmMemoryGCCall", | 
 | 
                                     JvmMemoryGCCallStarted);  | 
 | 
            } catch (Exception ex) { | 
 | 
                if (m != null) m.put("jvmMemory.getJvmMemoryGCCall", | 
 | 
                                     JvmMemoryGCCallFailed);  | 
 | 
            }  | 
 | 
            return;  | 
 | 
        }  | 
 | 
        throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public void checkJvmMemoryGCCall(EnumJvmMemoryGCCall x)  | 
 | 
        throws SnmpStatusException { | 
 | 
        if (x.intValue() != JvmMemoryGCCallStart.intValue())  | 
 | 
        throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryHeapCommitted() throws SnmpStatusException { | 
 | 
        final long val = getHeapMemoryUsage().getCommitted();  | 
 | 
        if (val > -1) return new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public EnumJvmMemoryGCVerboseLevel getJvmMemoryGCVerboseLevel()  | 
 | 
        throws SnmpStatusException { | 
 | 
        if (ManagementFactory.getMemoryMXBean().isVerbose())  | 
 | 
            return JvmMemoryGCVerboseLevelVerbose;  | 
 | 
        else  | 
 | 
            return JvmMemoryGCVerboseLevelSilent;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public void setJvmMemoryGCVerboseLevel(EnumJvmMemoryGCVerboseLevel x)  | 
 | 
        throws SnmpStatusException { | 
 | 
        if (JvmMemoryGCVerboseLevelVerbose.intValue() == x.intValue())  | 
 | 
            ManagementFactory.getMemoryMXBean().setVerbose(true);  | 
 | 
        else  | 
 | 
            ManagementFactory.getMemoryMXBean().setVerbose(false);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public void checkJvmMemoryGCVerboseLevel(EnumJvmMemoryGCVerboseLevel x)  | 
 | 
        throws SnmpStatusException { | 
 | 
        // Nothing to check...  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryHeapUsed() throws SnmpStatusException { | 
 | 
        final long val = getHeapMemoryUsage().getUsed();  | 
 | 
        if (val > -1) return new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryHeapInitSize() throws SnmpStatusException { | 
 | 
        final long val = getHeapMemoryUsage().getInit();  | 
 | 
        if (val > -1) return new Long(val);  | 
 | 
        else return Long0;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Long getJvmMemoryPendingFinalCount()  | 
 | 
        throws SnmpStatusException { | 
 | 
        final long val = ManagementFactory.getMemoryMXBean().  | 
 | 
            getObjectPendingFinalizationCount();  | 
 | 
 | 
 | 
        if (val > -1) return new Long((int)val);  | 
 | 
 | 
 | 
        // Should never happen... but stay safe all the same.  | 
 | 
          | 
 | 
        else return new Long(0);  | 
 | 
    }  | 
 | 
 | 
 | 
    static final MibLogger log = new MibLogger(JvmMemoryImpl.class);  | 
 | 
}  |