test/java/lang/management/BufferPoolMXBean/Basic.java

Print this page

        

@@ -20,24 +20,26 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
 /* @test
- * @bug 6606598
- * @summary Unit test for java.nio.BufferPoolMXBean
+ * @bug 6606598 7024172
+ * @summary Unit test for java.lang.management.BufferPoolMXBean
  * @run main/othervm Basic
  */
 
 import java.nio.ByteBuffer;
 import java.nio.MappedByteBuffer;
-import java.nio.BufferPoolMXBean;
+import java.nio.file.Path;
+import java.nio.file.Files;
+import static java.nio.file.StandardOpenOption.*;
 import java.nio.channels.FileChannel;
-import java.io.File;
-import java.io.RandomAccessFile;
+import java.lang.management.BufferPoolMXBean;
 import java.lang.management.ManagementFactory;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
+import java.lang.ref.WeakReference;
 import java.util.*;
 
 public class Basic {
 
     // static fields to ensure buffers aren't GC'ed

@@ -76,25 +78,25 @@
             int cap = 1024 + rand.nextInt(4096);
             buffers.add( ByteBuffer.allocateDirect(cap) );
             totalCapacity += cap;
         }
 
-        // map a file
-        File f = File.createTempFile("blah", null);
-        f.deleteOnExit();
-        RandomAccessFile raf = new RandomAccessFile(f, "rw");
-        FileChannel fc = raf.getChannel();
+        // create a mapped buffer
+        Path tmpfile = Files.createTempFile("blah", null);
+        tmpfile.toFile().deleteOnExit();
+        try (FileChannel fc = FileChannel.open(tmpfile, READ, WRITE)) {
         mbb = fc.map(FileChannel.MapMode.READ_WRITE, 10, 100);
         bufferCount++;
         totalCapacity += mbb.capacity();
+        }
 
-        // direct
+        // use platform MXBeans directly
         List<BufferPoolMXBean> pools =
             ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
         check(pools, bufferCount, totalCapacity);
 
-        // using MBeanServer
+        // use MBeanServer
         MBeanServer server = ManagementFactory.getPlatformMBeanServer();
         Set<ObjectName> mbeans = server.queryNames(
             new ObjectName("java.nio:type=BufferPool,*"), null);
         pools = new ArrayList<BufferPoolMXBean>();
         for (ObjectName name: mbeans) {

@@ -101,7 +103,15 @@
             BufferPoolMXBean pool = ManagementFactory
                 .newPlatformMXBeanProxy(server, name.toString(), BufferPoolMXBean.class);
             pools.add(pool);
         }
         check(pools, bufferCount, totalCapacity);
+
+        // attempt to unmap mapped buffer
+        WeakReference<MappedByteBuffer> ref = new WeakReference<>(mbb);
+        mbb = null;
+        do {
+            System.gc();
+            Thread.sleep(250);
+        } while (ref.get() != null);
     }
 }