/* * Copyright (c) 2003, 2006, 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 java.lang.management; import javax.management.openmbean.CompositeData; import sun.management.MemoryNotifInfoCompositeData; /** * The information about a memory notification. * *

* A memory notification is emitted by {@link MemoryMXBean} * when the Java virtual machine detects that the memory usage * of a memory pool is exceeding a threshold value. * The notification emitted will contain the memory notification * information about the detected condition: *

* *

* A {@link CompositeData CompositeData} representing * the MemoryNotificationInfo object * is stored in the * {@link javax.management.Notification#setUserData user data} * of a {@link javax.management.Notification notification}. * The {@link #from from} method is provided to convert from * a CompositeData to a MemoryNotificationInfo * object. For example: * *

 *      Notification notif;
 *
 *      // receive the notification emitted by MemoryMXBean and set to notif
 *      ...
 *
 *      String notifType = notif.getType();
 *      if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED) ||
 *          notifType.equals(MemoryNotificationInfo.MEMORY_COLLECTION_THRESHOLD_EXCEEDED)) {
 *          // retrieve the memory notification information
 *          CompositeData cd = (CompositeData) notif.getUserData();
 *          MemoryNotificationInfo info = MemoryNotificationInfo.from(cd);
 *          ....
 *      }
 * 
* *

* The types of notifications emitted by MemoryMXBean are: *

* * @author Mandy Chung * @since 1.5 * */ public class MemoryNotificationInfo { private final String poolName; private final MemoryUsage usage; private final long count; /** * Notification type denoting that * the memory usage of a memory pool has * reached or exceeded its * usage threshold value. * This notification is emitted by {@link MemoryMXBean}. * Subsequent crossing of the usage threshold value does not cause * further notification until the memory usage has returned * to become less than the usage threshold value. * The value of this notification type is * java.management.memory.threshold.exceeded. */ public static final String MEMORY_THRESHOLD_EXCEEDED = "java.management.memory.threshold.exceeded"; /** * Notification type denoting that * the memory usage of a memory pool is greater than or equal to its * * collection usage threshold after the Java virtual machine * has expended effort in recycling unused objects in that * memory pool. * This notification is emitted by {@link MemoryMXBean}. * The value of this notification type is * java.management.memory.collection.threshold.exceeded. */ public static final String MEMORY_COLLECTION_THRESHOLD_EXCEEDED = "java.management.memory.collection.threshold.exceeded"; /** * Constructs a MemoryNotificationInfo object. * * @param poolName The name of the memory pool which triggers this notification. * @param usage Memory usage of the memory pool. * @param count The threshold crossing count. */ public MemoryNotificationInfo(String poolName, MemoryUsage usage, long count) { if (poolName == null) { throw new NullPointerException("Null poolName"); } if (usage == null) { throw new NullPointerException("Null usage"); } this.poolName = poolName; this.usage = usage; this.count = count; } MemoryNotificationInfo(CompositeData cd) { MemoryNotifInfoCompositeData.validateCompositeData(cd); this.poolName = MemoryNotifInfoCompositeData.getPoolName(cd); this.usage = MemoryNotifInfoCompositeData.getUsage(cd); this.count = MemoryNotifInfoCompositeData.getCount(cd); } /** * Returns the name of the memory pool that triggers this notification. * The memory pool usage has crossed a threshold. * * @return the name of the memory pool that triggers this notification. */ public String getPoolName() { return poolName; } /** * Returns the memory usage of the memory pool * when this notification was constructed. * * @return the memory usage of the memory pool * when this notification was constructed. */ public MemoryUsage getUsage() { return usage; } /** * Returns the number of times that the memory usage has crossed * a threshold when the notification was constructed. * For usage threshold notifications, this count will be the * {@link MemoryPoolMXBean#getUsageThresholdCount threshold * count}. For collection threshold notifications, * this count will be the * {@link MemoryPoolMXBean#getCollectionUsageThresholdCount * collection usage threshold count}. * * @return the number of times that the memory usage has crossed * a threshold when the notification was constructed. */ public long getCount() { return count; } /** * Returns a MemoryNotificationInfo object represented by the * given CompositeData. * The given CompositeData must contain * the following attributes: *
* * * * * * * * * * * * * * * * * *
Attribute NameType
poolNamejava.lang.String
usagejavax.management.openmbean.CompositeData
countjava.lang.Long
*
* * @param cd CompositeData representing a * MemoryNotificationInfo * * @throws IllegalArgumentException if cd does not * represent a MemoryNotificationInfo object. * * @return a MemoryNotificationInfo object represented * by cd if cd is not null; * null otherwise. */ public static MemoryNotificationInfo from(CompositeData cd) { if (cd == null) { return null; } if (cd instanceof MemoryNotifInfoCompositeData) { return ((MemoryNotifInfoCompositeData) cd).getMemoryNotifInfo(); } else { return new MemoryNotificationInfo(cd); } } }