/* MemoryPoolMXBean.java - Interface for a memory pool bean
   Copyright (C) 2006 Free Software Foundation

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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 for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package java.lang.management;

/**
 * <p>
 * Provides access to information about one of the memory
 * resources or pools used by the virtual machine.  Instances
 * of this bean are obtained by calling
 * {@link ManagementFactory#getMemoryPoolMXBeans()}.  One
 * bean is returned for each memory pool provided.
 * </p>
 * <p>
 * The memory pool bean allows the usage of the pool to be
 * monitored.  The bean can provide statistics on the current
 * and peak usage of the pool, and on the threshold levels the
 * pool uses.
 * </p>
 * <p>
 * {@link getUsage()} returns an approximation of the current
 * usage of the pool.  Calls to this method are expected to be
 * generally quick to perform; if the call is expensive, the
 * documentation of the bean should specify so.  For memory
 * pool beans that represent the memory used by garbage
 * collectors, the usage level includes both referenced and
 * unreferenced objects.
 * </p>
 * <p>
 * {@link getPeakUsage()} and {@link resetPeakUsage()} enable
 * the retrieval of the peak usage level and setting it to the
 * current usage level, respectively.  Initially, the peak usage
 * level is relative to the start of the virtual machine.
 * </p>
 * <p>
 * Memory pools may also include optional support for usage thresholds.
 * The usage threshold is a particular level of memory usage.  When this
 * value is crossed (the current memory usage becomes equal to or greater
 * than this threshold level), the usage threshold count is increased.
 * This feature is designed for monitoring the trend in memory usage.
 * Support for a collection usage threshold is also provided, for
 * particular garbage collectors.  This is used to monitor the amount
 * of memory left uncollected after a garbage collection cycle.  There
 * is no need to make special garbage collection runs to support this;
 * the level following collection just needs to be monitored.
 * </p>
 *
 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
 * @since 1.5
 */
public interface MemoryPoolMXBean
{

  /**
   * Returns memory usage statistics after a best-effort attempt
   * has been made to remove unused objects from the pool.  This
   * method is designed for use by the pools of garbage collectors,
   * in order to monitor the amount of memory used after collections.
   * It will return <code>null</code> if such functionality is
   * unsupported by the memory pool represented by this bean.
   *
   * @return the memory usage of the memory pool after the most
   *         recent garbage collection cycle, or <code>null</code>
   *         if this operation is not supported.
   */
  MemoryUsage getCollectionUsage();

  /**
   * Returns the collection usage threshold level in bytes.  This
   * value is initially zero.
   *
   * @return the collection usage threshold in bytes.
   * @throws UnsupportedOperationException if the collection usage
   *                                       threshold is not supported.
   * @see #getCollectionUsageThresholdCount()
   * @see #isCollectionUsageThresholdExceeded()
   * @see #isCollectionUsageThresholdSupported()
   * @see #setCollectionUsageThreshold(long)
   */
  long getCollectionUsageThreshold();

  /**
   * Returns the number of times the usage level has matched or
   * exceeded the collection usage threshold.
   *
   * @return the number of times the usage level has matched
   *         or exceeded the collection usage threshold.
   * @throws UnsupportedOperationException if the collection usage
   *                                       threshold is not supported.
   * @see #getCollectionUsageThreshold()
   * @see #isCollectionUsageThresholdExceeded()
   * @see #isCollectionUsageThresholdSupported()
   * @see #setCollectionUsageThreshold(long)
   */
  long getCollectionUsageThresholdCount();

  /**
   * Returns the names of the memory managers associated with this
   * pool.  Each pool has at least one memory manager.
   *
   * @return an array containing the name of each memory manager
   *         responsible for this pool.
   */
  String[] getMemoryManagerNames();

  /**
   * Returns the name of the memory pool.
   *
   * @return the memory pool name.
   */
  String getName();

  /**
   * Returns memory usage statistics for the peak memory usage
   * of the pool.  The peak is the maximum memory usage occurring
   * since the virtual machine was started or since the peak
   * was reset by {@link #resetPeakUsage()}.  The return value
   * may be <code>null</code> if this pool is no longer valid.
   *
   * @return the memory usage of the memory pool at its peak,
   *         or <code>null</code> if this pool is no longer valid.
   */
  MemoryUsage getPeakUsage();

  /**
   * Returns the type of memory used by this pool.  This can be
   * either heap or non-heap memory.
   *
   * @return the type of this pool.
   */
  MemoryType getType();

  /**
   * Returns memory usage statistics for the current memory usage
   * of the pool.  The return value may be <code>null</code> if
   * this pool is no longer valid.  Obtaining these values is
   * expected to be a relatively quick operation; if this will
   * instead be an expensive operation to perform, the documentation
   * of the implementating bean should specify that this is the
   * case.  The values are intended to be an estimate for monitoring
   * purposes.
   *
   * @return the memory usage of the memory pool at present,
   *         or <code>null</code> if this pool is no longer valid.
   */
  MemoryUsage getUsage();

  /**
   * Returns the usage threshold level in bytes.  This
   * value is initially defined by the virtual machine.
   *
   * @return the usage threshold in bytes.
   * @throws UnsupportedOperationException if the usage threshold
   *                                       is not supported.
   * @see #getUsageThresholdCount()
   * @see #isUsageThresholdExceeded()
   * @see #isUsageThresholdSupported()
   * @see #setUsageThreshold(long)
   */
  long getUsageThreshold();

  /**
   * Returns the number of times the usage level has matched or
   * exceeded the usage threshold.
   *
   * @return the number of times the usage level has matched
   *         or exceeded the usage threshold.
   * @throws UnsupportedOperationException if the usage threshold
   *                                       is not supported.
   * @see #getUsageThreshold()
   * @see #isUsageThresholdExceeded()
   * @see #isUsageThresholdSupported()
   * @see #setUsageThreshold(long)
   */
  long getUsageThresholdCount();

  /**
   * Returns true if the collection usage level is equal to 
   * or greater than the collection usage threshold.
   *
   * @return true if the collection usage threshold has been
   *         matched or exceeded.
   * @throws UnsupportedOperationException if the collection usage
   *                                       threshold is not supported.
   * @see #getCollectionUsageThreshold()
   * @see #getCollectionUsageThresholdCount()
   * @see #isCollectionUsageThresholdSupported()
   * @see #setCollectionUsageThreshold(long)
   */
  boolean isCollectionUsageThresholdExceeded();

  /**
   * Returns true if this memory pool supports a collection usage
   * level threshold.
   *
   * @return true if a collection usage level threshold is supported.
   * @see #getCollectionUsageThreshold()
   * @see #getCollectionUsageThresholdCount()
   * @see #isCollectionUsageThresholdExceeded()
   * @see #setCollectionUsageThreshold(long)
   */
  boolean isCollectionUsageThresholdSupported();

  /**
   * Returns true if the usage level is equal to 
   * or greater than the usage threshold.
   *
   * @return true if the usage threshold has been
   *         matched or exceeded.
   * @throws UnsupportedOperationException if the usage threshold
   *                                       is not supported.
   * @see #getUsageThreshold()
   * @see #getUsageThresholdCount()
   * @see #isUsageThresholdSupported()
   * @see #setUsageThreshold(long)
   */
  boolean isUsageThresholdExceeded();

  /**
   * Returns true if this memory pool supports a usage level threshold.
   *
   * @return true if a usage level threshold is supported.
   * @see #getUsageThreshold()
   * @see #getUsageThresholdCount()
   * @see #isUsageThresholdExceeded()
   * @see #setUsageThreshold(long)
   */
  boolean isUsageThresholdSupported();
  
  /**
   * Returns true if this memory pool is still valid.  A memory pool
   * becomes invalid when it is removed by the virtual machine and
   * no longer used.
   *
   * @return true if this memory pool is valid.
   */
  boolean isValid();

  /**
   * Resets the peak memory usage level to the current memory usage
   * level.
   *
   * @throws SecurityException if a security manager exists and
   *                           denies ManagementPermission("control").
   */
  void resetPeakUsage();

  /**
   * Sets the collection threshold usage level to the given value.
   * A value of zero disables the collection threshold.
   *
   * @param threshold the new threshold level.
   * @throws IllegalArgumentException if the threshold hold level
   *                                  is negative.
   * @throws UnsupportedOperationException if the collection usage
   *                                       threshold is not supported.
   * @throws SecurityException if a security manager exists and
   *                           denies ManagementPermission("control").
   * @see #getCollectionUsageThreshold()
   * @see #getCollectionUsageThresholdCount()
   * @see #isCollectionUsageThresholdExceeded()
   * @see #isCollectionUsageThresholdSupported()
   */
  void setCollectionUsageThreshold(long threshold);

  /**
   * Sets the threshold usage level to the given value.  A value of
   * zero disables the threshold.
   *
   * @param threshold the new threshold level.
   * @throws IllegalArgumentException if the threshold hold level
   *                                  is negative.
   * @throws UnsupportedOperationException if the usage threshold
   *                                       is not supported.
   * @throws SecurityException if a security manager exists and
   *                           denies ManagementPermission("control").
   * @see #getUsageThreshold()
   * @see #getUsageThresholdCount()
   * @see #isUsageThresholdExceeded()
   * @see #isUsageThresholdSupported()
   */
  void setUsageThreshold(long threshold);

}
