packagejava.lang.management;importjavax.management.openmbean.CompositeData;importsun.management.MemoryUsageCompositeData;/*** A MemoryUsage object represents a snapshot of memory usage.
* Instances of the MemoryUsage class are usually constructed
* by methods that are used to obtain memory usage
* information about individual memory pool of the Java virtual machine or
* the heap or non-heap memory of the Java virtual machine as a whole.
*
*
A MemoryUsage object contains four values:
*
*
*
init*
represents the initial amount of memory (in bytes) that* the Java virtual machine requests from the operating system
* for memory management during startup. The Java virtual machine
* may request additional memory from the operating system and
* may also release memory to the system over time.
* The value of init may be undefined.
*
*
*
*
used*
represents the amount of memory currently used (in bytes).*
*
*
*
committed*
represents the amount of memory (in bytes) that is* guaranteed to be available for use by the Java virtual machine.
* The amount of committed memory may change over time (increase
* or decrease). The Java virtual machine may release memory to
* the system and committed could be less than init.
* committed will always be greater than
* or equal to used.
*
*
*
*
max*
represents the maximum amount of memory (in bytes)* that can be used for memory management. Its value may be undefined.
* The maximum amount of memory may change over time if defined.
* The amount of used and committed memory will always be less than
* or equal to max if max is defined.
* A memory allocation may fail if it attempts to increase the
* used memory such that used > committed even
* if used <= max would still be true (for example,
* when the system is low on virtual memory).
*
*
*
*
* Below is a picture showing an example of a memory pool:
*
*
* +----------------------------------------------+
* + | +
* + | +
* +----------------------------------------------+
*
* |--------|
* init
* |---------------|
* used
* |---------------------------|
* committed
* |----------------------------------------------|
* max
*
*
*
MXBean Mapping
* MemoryUsage is mapped to a {@linkCompositeData CompositeData}
* with attributes as specified in the {@link#from from} method.
*
*@authorMandy Chung
*@since1.5*/
public classMemoryUsage {private final longinit;private final longused;private final longcommitted;private final longmax;/*** Constructs a MemoryUsage object.
*
*@paraminit the initial amount of memory in bytes that
* the Java virtual machine allocates;
* or -1 if undefined.
*@paramused the amount of used memory in bytes.
*@paramcommitted the amount of committed memory in bytes.
*@parammax the maximum amount of memory in bytes that
* can be used; or -1 if undefined.
*
*@throwsIllegalArgumentException if
*
*
the value of init or max is negative* but not -1; or
*
the value of used or committed is negative;* or
*
used is greater than the value of committed;* or
*
committed is greater than the value of max* max if defined.
*
*/public MemoryUsage(longinit,longused,longcommitted,longmax) {if (init < -1) {throw new IllegalArgumentException( "init parameter = " +init+ " is negative but not -1.");
}if (max < -1) {throw new IllegalArgumentException( "max parameter = " +max+ " is negative but not -1.");
}if (used < 0) {throw new IllegalArgumentException( "used parameter = " +used+ " is negative.");
}if (committed < 0) {throw new IllegalArgumentException( "committed parameter = " +committed+ " is negative.");
}if (used >committed) {throw new IllegalArgumentException( "used = " + used +
" should be <= committed = " +committed);
}if (max >= 0 && committed >max) {throw new IllegalArgumentException( "committed = " + committed +
" should be < max = " +max);
}this.init =init;this.used =used;this.committed =committed;this.max =max;
}/*** Constructs a MemoryUsage object from a
* {@linkCompositeData CompositeData}.*/
privateMemoryUsage(CompositeData cd) {//validate the input composite data
MemoryUsageCompositeData.validateCompositeData(cd);this.init =MemoryUsageCompositeData.getInit(cd);this.used =MemoryUsageCompositeData.getUsed(cd);this.committed =MemoryUsageCompositeData.getCommitted(cd);this.max =MemoryUsageCompositeData.getMax(cd);
}/*** Returns the amount of memory in bytes that the Java virtual machine
* initially requests from the operating system for memory management.
* This method returns -1 if the initial memory size is undefined.
*
*@returnthe initial size of memory in bytes;
* -1 if undefined.*/
public longgetInit() {returninit;
}/*** Returns the amount of used memory in bytes.
*
*@returnthe amount of used memory in bytes.
**/
public longgetUsed() {returnused;
};/*** Returns the amount of memory in bytes that is committed for
* the Java virtual machine to use. This amount of memory is
* guaranteed for the Java virtual machine to use.
*
*@returnthe amount of committed memory in bytes.
**/
public longgetCommitted() {returncommitted;
};/*** Returns the maximum amount of memory in bytes that can be
* used for memory management. This method returns -1
* if the maximum memory size is undefined.
*
*
This amount of memory is not guaranteed to be available
* for memory management if it is greater than the amount of
* committed memory. The Java virtual machine may fail to allocate
* memory even if the amount of used memory does not exceed this
* maximum size.
*
*@returnthe maximum amount of memory in bytes;
* -1 if undefined.*/
public longgetMax() {returnmax;
};/*** Returns a descriptive representation of this memory usage.*/
publicString toString() {
StringBuffer buf= newStringBuffer();
buf.append("init = " + init + "(" + (init >> 10) + "K) ");
buf.append("used = " + used + "(" + (used >> 10) + "K) ");
buf.append("committed = " + committed + "(" +(committed>> 10) + "K) ");
buf.append("max = " + max + "(" + (max >> 10) + "K)");returnbuf.toString();
}/*** Returns a MemoryUsage object represented by the
* given CompositeData. The given CompositeData
* must contain the following attributes:
*
*
*
*
*
Attribute Name*
Type*
*
*
init*
java.lang.Long*
*
*
used*
java.lang.Long*
*
*
committed*
java.lang.Long*
*
*
max*
java.lang.Long*
*
*
*
*@paramcd CompositeData representing a MemoryUsage
*
*@throwsIllegalArgumentException if cd does not
* represent a MemoryUsage with the attributes described
* above.
*
*@returna MemoryUsage object represented by cd
* if cd is not null;
* null otherwise.*/
public staticMemoryUsage from(CompositeData cd) {if (cd == null) {return null;
}if (cd instanceofMemoryUsageCompositeData) {return((MemoryUsageCompositeData) cd).getMemoryUsage();
}else{return newMemoryUsage(cd);
}
}
}