我试图通过使用MappedByteBuffer
映射特定文件来实现两个或多个JVM之间的某种共享缓存。从规范中我看到,当我们使用MappedByteBuffer.load()
时,它应该将数据加载到一个直接缓冲区中。我对此有几个问题。
我的代码片段::
RandomAccessFile file = new RandomAccessFile("file.txt","rw");
FileChannel fc = file.getChannel();
MappedByteBuffer buf5 = fc.map(MapMode.READ_WRITE, 0, fc.size());
//ByteBuffer buf6 = ByteBuffer.allocateDirect(100000000);
buf5.load();
try
{
Class c = Class.forName("java.nio.Bits");
Field f = c.getDeclaredField("reservedMemory");
f.setAccessible(true);
long reservedMemory = f.getLong(null);
f = c.getDeclaredField("maxMemory");
f.setAccessible(true);
System.out.println(
"Direct Memory Usage: "+ reservedMemory +"/"+ f.getLong(null)+"\n");
}
catch (Throwable t)
{
}
在这两种情况下,我都对记忆的结局感到有点困惑。
谢谢!
发布于 2009-08-05 07:25:23
直接ByteBuffers (使用ByteBuffer.allocateDirect分配的部分)与MappedByteBuffers不同,因为它们代表不同的内存部分,并且分配的不同。直接ByteBuffers是一种访问在JVM之外分配的内存块的方法,这些内存通常是通过malloc调用分配的(尽管大多数实现可能使用高效的块分配器)。也就是说,它只是一个指向内存块的指针。
MappedByteBuffer表示使用mmap调用分配的一段内存,它用于执行内存映射I/O,因此MappedByteBuffers不会像直接ByteBuffer那样注册内存。
因此,虽然两者都是“直接”的,因为它们代表JVM之外的内存,但它们的用途不同。
另外,为了获得reservedMemory值,您正在反射地调用JVM的一个内部方法,该方法的实现不包含在任何规范中,因此无法保证该值返回什么。可以使用来自C/C++的NewDirectByteBuffer调用(MappedByteBuffers可能使用此方法)从JNI内部分配直接reservedMemory值,这可能不会影响reservedMemory值,只有在使用reservedMemory ByteBuffer.allocateDirect时才会更改。
https://stackoverflow.com/questions/1229037
复制相似问题