test/java/lang/management/BufferPoolMXBean/Basic.java
Print this page
*** 20,43 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
! * @bug 6606598
! * @summary Unit test for java.nio.BufferPoolMXBean
* @run main/othervm Basic
*/
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
! import java.nio.BufferPoolMXBean;
import java.nio.channels.FileChannel;
! import java.io.File;
! import java.io.RandomAccessFile;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.util.*;
public class Basic {
// static fields to ensure buffers aren't GC'ed
--- 20,45 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
! * @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.file.Path;
! import java.nio.file.Files;
! import static java.nio.file.StandardOpenOption.*;
import java.nio.channels.FileChannel;
! 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,100 ****
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();
mbb = fc.map(FileChannel.MapMode.READ_WRITE, 10, 100);
bufferCount++;
totalCapacity += mbb.capacity();
! // direct
List<BufferPoolMXBean> pools =
ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
check(pools, bufferCount, totalCapacity);
! // using 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) {
--- 78,102 ----
int cap = 1024 + rand.nextInt(4096);
buffers.add( ByteBuffer.allocateDirect(cap) );
totalCapacity += cap;
}
! // 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();
+ }
! // use platform MXBeans directly
List<BufferPoolMXBean> pools =
ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
check(pools, bufferCount, totalCapacity);
! // 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,107 ****
--- 103,117 ----
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);
}
}