Tag: 内存映射文件

使用java.nio在内存中写入文件?

使用nio,可以将现有文件映射到内存中。 但是有可能只在内存中创建它而没有硬盘上的文件吗? 我想模仿CreateFileMapping窗口函数,它允许你在内存中写入。 Java中是否有等效的系统? 目标是在内存中写入以便另一个程序(c)读取它。

Java:内存高效的ByteArrayOutputStream

我在磁盘中有一个40MB的文件,我需要使用字节数组将其“映射”到内存中。 起初,我认为将文件写入ByteArrayOutputStream是最好的方法,但我发现在复制操作期间的某个时刻需要大约160MB的堆空间。 如果不使用RAM文件大小的三倍,有人知道更好的方法吗? 更新:感谢您的回答。 我注意到我可以减少内存消耗,稍微告诉ByteArrayOutputStream初始大小要比原始文件大小稍大一些(使用我的代码强制重新分配的确切大小,得到检查原因)。 还有另一个高内存点:当我用ByteArrayOutputStream.toByteArray返回byte []时。 看看它的源代码,我可以看到它正在克隆数组: public synchronized byte toByteArray()[] { return Arrays.copyOf(buf, count); } 我想我可以扩展ByteArrayOutputStream并重写此方法,以便直接返回原始数组。 这里有没有潜在的危险,因为流和字节数组不会被多次使用?

Java – 堆与直接内存访问

我最近遇到了sun.misc.Unsafe类,允许用户以类似于C的方式分配,解除分配和一般访问内存。我读了几个解决这个问题的博客,例如 哪个更快 – 堆或直接内存 – 测试结果声称堆 堆外内存与DirectByteBuffer vs Heap – 堆外似乎是最快的 时间序列数据的内存映射文件 – MappedByteBuffer比堆对象更快 第1条似乎与其他条款相矛盾,我无法理解其中的原因。 DirectMemoryBuffer在引擎盖下使用了sun.misc.Unsafe (因此是MappedByteBuffer ),因此它们也应该受到第1条所述的JNI调用的影响。另外,在第2条中,堆外内存访问类似于第1条中的内容,并给出完全相反的结果。 有人可能会评论如何处理堆外记忆,即何时使用它,是否有显着的好处,最重要的是,为什么类似的主题根据上述文章给出了截然不同的结果? 谢谢。

内存映射文件java NIO

我理解如何创建一个内存映射文件,但我的问题是让我们说在以下行: FileChannel roChannel = new RandomAccessFile(file, “r”).getChannel(); ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, SIZE); 例如,我将SIZE设置为2MB,这是否意味着它只会加载2MB的文件,或者它会在文件中进一步读取并更新缓冲区,因为我从中消耗了字节数?

multithreading可以在Java中看到直接映射的ByteBuffer上的写入吗?

我正在开发一些使用ByteBuffers的东西,它使用内存映射文件(通过FileChannel.map() )以及内存中的直接ByteBuffers构建。 我试图了解并发和内存模型约束。 我已经阅读了FileChannel,ByteBuffer,MappedByteBuffer等所有相关的Javadoc(和源代码)。很明显,特定的ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法。 因此,如果跨线程使用该缓冲区,则必须在修改特定ByteBuffer的状态时进行同步。 常见的技巧包括使用ThreadLocal包装ByteBuffer,复制(同步)以获取指向相同映射字节的新实例等。 鉴于这种情况: manager有一个映射的字节缓冲区B_all用于整个文件(比如它<2gb) 管理器调用B_all上的duplicate(),position(),limit()和slice()来创建一个新的较小的ByteBuffer B_1 ,该文件的一大块并将其提供给线程T1 manager执行所有相同的操作来创建指向相同映射字节的ByteBuffer B_2并将其提供给线程T2 我的问题是:T1能否同时写入B_1和T2写入B_2并保证看到彼此的变化? T3是否可以使用B_all读取这些字节并保证看到T1和T2的变化? 我知道,除非您使用force()指示操作系统将页面写入磁盘,否则不一定会在进程中看到映射文件中的写入。 我不在乎。 假设这个问题,这个JVM是编写单个映射文件的唯一进程。 注意:我不是在寻找猜测(我可以自己做得很好)。 我想引用一些关于内存映射直接缓冲区保证(或不保证)的内容。 或者,如果您有实际经验或负面测试用例,那么这也可以作为充分的证据。 更新:我已经完成了一些测试,让多个线程并行写入同一个文件,到目前为止,这些写入似乎可以从其他线程立即看到。 我不确定我是否可以依赖它。