首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ByteBuffer.allocateDirect()和MappedByteBuffer.load()之间的区别

ByteBuffer.allocateDirect()和MappedByteBuffer.load()之间的区别
EN

Stack Overflow用户
提问于 2009-08-04 18:03:23
回答 1查看 10K关注 0票数 15

我试图通过使用MappedByteBuffer映射特定文件来实现两个或多个JVM之间的某种共享缓存。从规范中我看到,当我们使用MappedByteBuffer.load()时,它应该将数据加载到一个直接缓冲区中。我对此有几个问题。

我的代码片段::

代码语言:javascript
运行
复制
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)
{
}
  1. 对于直接内存使用(File.txt为1GB),上述代码的输出为0字节。但如果我取消评论..。 ByteBuffer buf6 = ByteBuffer.allocateDirect(100000000); 我的直接内存使用量为100 of。无法理解为什么会这样,为什么我一开始就没有得到任何直接的内存使用(即当行被注释掉时)
  2. 尽管上述代码的直接内存使用量为0B,但我确实看到进程的驻留内存(使用unix )增加了1GB。但是如果我在盒子上做一个“免费的-m”,我没有看到内存使用量的任何增加。

在这两种情况下,我都对记忆的结局感到有点困惑。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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时才会更改。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1229037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档