--- old/src/share/classes/java/lang/management/PlatformComponent.java Tue Jun 23 09:50:55 2009 +++ new/src/share/classes/java/lang/management/PlatformComponent.java Tue Jun 23 09:50:54 2009 @@ -34,7 +34,6 @@ import java.util.logging.LogManager; import java.nio.BufferPoolMXBean; import javax.management.MBeanServerConnection; -import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import com.sun.management.HotSpotDiagnosticMXBean; @@ -198,10 +197,7 @@ "java.nio", "BufferPool", keyProperties("name"), new MXBeanFetcher() { public List getMXBeans() { - List pools = new ArrayList(2); - pools.add( sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPoolMXBean() ); - pools.add( sun.nio.ch.FileChannelImpl.getMappedBufferPoolMXBean() ); - return pools; + return ManagementFactoryHelper.getBufferPoolMXBeans(); } }), --- old/src/share/classes/java/nio/Bits.java Tue Jun 23 09:50:57 2009 +++ new/src/share/classes/java/nio/Bits.java Tue Jun 23 09:50:56 2009 @@ -26,11 +26,8 @@ package java.nio; import java.security.AccessController; -import java.security.PrivilegedAction; import sun.misc.Unsafe; import sun.misc.VM; -import javax.management.ObjectName; -import javax.management.MalformedObjectNameException; /** * Access to bits, native and otherwise. @@ -676,7 +673,7 @@ } } - // -- Management interface for monitoring of direct buffer usage -- + // -- Monitoring of direct buffer usage -- static { // setup access to this package in SharedSecrets @@ -683,50 +680,29 @@ sun.misc.SharedSecrets.setJavaNioAccess( new sun.misc.JavaNioAccess() { @Override - public BufferPoolMXBean getDirectBufferPoolMXBean() { - return LazyInitialization.directBufferPoolMXBean; + public sun.misc.JavaNioAccess.BufferPool getDirectBufferPool() { + return new sun.misc.JavaNioAccess.BufferPool() { + @Override + public String getName() { + return "direct"; + } + @Override + public long getCount() { + return Bits.count; + } + @Override + public long getTotalCapacity() { + return Bits.usedMemory; + } + @Override + public long getMemoryUsed() { + return Bits.reservedMemory; + } + }; } - } - ); + }); } - // Lazy initialization of management interface - private static class LazyInitialization { - static final BufferPoolMXBean directBufferPoolMXBean = directBufferPoolMXBean(); - - private static BufferPoolMXBean directBufferPoolMXBean() { - final String pool = "direct"; - final ObjectName obj; - try { - obj = new ObjectName("java.nio:type=BufferPool,name=" + pool); - } catch (MalformedObjectNameException x) { - throw new AssertionError(x); - } - return new BufferPoolMXBean() { - @Override - public ObjectName getObjectName() { - return obj; - } - @Override - public String getName() { - return pool; - } - @Override - public long getCount() { - return Bits.count; - } - @Override - public long getTotalCapacity() { - return Bits.usedMemory; - } - @Override - public long getMemoryUsed() { - return Bits.reservedMemory; - } - }; - } - } - // -- Bulk get/put acceleration -- // These numbers represent the point at which we have empirically --- old/src/share/classes/java/nio/Direct-X-Buffer.java Tue Jun 23 09:50:59 2009 +++ new/src/share/classes/java/nio/Direct-X-Buffer.java Tue Jun 23 09:50:58 2009 @@ -30,7 +30,6 @@ import sun.misc.Cleaner; import sun.misc.Unsafe; import sun.nio.ch.DirectBuffer; -import sun.nio.ch.FileChannelImpl; class Direct$Type$Buffer$RW$$BO$ --- old/src/share/classes/sun/management/ManagementFactoryHelper.java Tue Jun 23 09:51:01 2009 +++ new/src/share/classes/sun/management/ManagementFactoryHelper.java Tue Jun 23 09:51:01 2009 @@ -26,22 +26,15 @@ package sun.management; import java.lang.management.*; -import java.util.logging.LogManager; -import javax.management.DynamicMBean; import javax.management.MBeanServer; -import javax.management.MBeanServerFactory; -import javax.management.MBeanInfo; -import javax.management.NotificationEmitter; import javax.management.ObjectName; -import javax.management.ObjectInstance; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.MBeanRegistrationException; import javax.management.NotCompliantMBeanException; import javax.management.RuntimeOperationsException; -import javax.management.StandardEmitterMBean; -import javax.management.StandardMBean; +import java.nio.BufferPoolMXBean; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; @@ -49,11 +42,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.Iterator; -import java.util.ListIterator; import com.sun.management.OSMBeanFactory; import com.sun.management.HotSpotDiagnosticMXBean; @@ -68,7 +56,6 @@ private static VMManagement jvm; - private static boolean mbeansCreated = false; private static ClassLoadingImpl classMBean = null; private static MemoryImpl memoryMBean = null; private static ThreadImpl threadMBean = null; @@ -148,6 +135,58 @@ return result; } + public static List getBufferPoolMXBeans() { + List pools = new ArrayList(2); + pools.add(createBufferPoolMXBean(sun.misc.SharedSecrets.getJavaNioAccess() + .getDirectBufferPool())); + pools.add(createBufferPoolMXBean(sun.nio.ch.FileChannelImpl + .getMappedBufferPool())); + return pools; + } + + private final static String BUFFER_POOL_MXBEAN_NAME = "java.nio:type=BufferPool"; + + /** + * Creates management interface for the given buffer pool. + */ + private static BufferPoolMXBean + createBufferPoolMXBean(final sun.misc.JavaNioAccess.BufferPool pool) + { + return new BufferPoolMXBean() { + private volatile ObjectName objname; // created lazily + @Override + public ObjectName getObjectName() { + ObjectName result = objname; + if (result == null) { + synchronized (this) { + if (objname == null) { + result = ObjectName.valueOf(BUFFER_POOL_MXBEAN_NAME + + ",name=" + pool.getName()); + objname = result; + } + } + } + return result; + } + @Override + public String getName() { + return pool.getName(); + } + @Override + public long getCount() { + return pool.getCount(); + } + @Override + public long getTotalCapacity() { + return pool.getTotalCapacity(); + } + @Override + public long getMemoryUsed() { + return pool.getMemoryUsed(); + } + }; + } + private static HotSpotDiagnostic hsDiagMBean = null; private static HotspotRuntime hsRuntimeMBean = null; private static HotspotClassLoading hsClassMBean = null; @@ -163,8 +202,6 @@ } /** - - /** * This method is for testing only. */ public static synchronized HotspotRuntimeMBean getHotspotRuntimeMBean() { --- old/src/share/classes/sun/misc/JavaNioAccess.java Tue Jun 23 09:51:03 2009 +++ new/src/share/classes/sun/misc/JavaNioAccess.java Tue Jun 23 09:51:03 2009 @@ -25,8 +25,15 @@ package sun.misc; -import java.nio.BufferPoolMXBean; - public interface JavaNioAccess { - BufferPoolMXBean getDirectBufferPoolMXBean(); + /** + * Provides access to information on buffer usage. + */ + interface BufferPool { + String getName(); + long getCount(); + long getTotalCapacity(); + long getMemoryUsed(); + } + BufferPool getDirectBufferPool(); } --- old/src/share/classes/sun/nio/ch/FileChannelImpl.java Tue Jun 23 09:51:05 2009 +++ new/src/share/classes/sun/nio/ch/FileChannelImpl.java Tue Jun 23 09:51:05 2009 @@ -29,13 +29,10 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; -import java.nio.BufferPoolMXBean; import java.nio.channels.*; import java.util.ArrayList; import java.util.List; import java.security.AccessController; -import javax.management.ObjectName; -import javax.management.MalformedObjectNameException; import sun.misc.Cleaner; import sun.security.action.GetPropertyAction; @@ -805,47 +802,28 @@ } /** - * Returns the management interface for mapped buffers + * Invoked by sun.management.ManagementFactoryHelper to create the management + * interface for mapped buffers. */ - public static BufferPoolMXBean getMappedBufferPoolMXBean() { - return LazyInitialization.mappedBufferPoolMXBean; - } - - // Lazy initialization of management interface - private static class LazyInitialization { - static final BufferPoolMXBean mappedBufferPoolMXBean = mappedBufferPoolMXBean(); - - private static BufferPoolMXBean mappedBufferPoolMXBean() { - final String pool = "mapped"; - final ObjectName obj; - try { - obj = new ObjectName("java.nio:type=BufferPool,name=" + pool); - } catch (MalformedObjectNameException x) { - throw new AssertionError(x); + public static sun.misc.JavaNioAccess.BufferPool getMappedBufferPool() { + return new sun.misc.JavaNioAccess.BufferPool() { + @Override + public String getName() { + return "mapped"; } - return new BufferPoolMXBean() { - @Override - public ObjectName getObjectName() { - return obj; - } - @Override - public String getName() { - return pool; - } - @Override - public long getCount() { - return Unmapper.count; - } - @Override - public long getTotalCapacity() { - return Unmapper.totalCapacity; - } - @Override - public long getMemoryUsed() { - return Unmapper.totalSize; - } - }; - } + @Override + public long getCount() { + return Unmapper.count; + } + @Override + public long getTotalCapacity() { + return Unmapper.totalCapacity; + } + @Override + public long getMemoryUsed() { + return Unmapper.totalSize; + } + }; } // -- Locks --