`

使用MappedByteBuffer要注意的问题

 
阅读更多
使用MappedByteBuffer来操作内存映射文件是NIO提供的强大武器,由于将对文件的操作映射到内存中,读写性能都会提高。需要注意的问题是,在MappedByteBuffer的javadoc中有这样一句:
* A mapped byte buffer and the file mapping that it represents remain
* valid until the buffer itself is garbage-collected.
这句话的意思如果一个MappedByteBuffer对象没有被垃圾回收,那么这个对象和他所代表的映射文件是一直有效的。
这意味着什么呢?这意味着一旦一个文件被映射为内存文件,即使你关闭了这个文件,该文件也无法再次被打开,直到文件所对应的MappedByteBuffer对象被GC,该文件会被系统释放,才可以再次打开。
目前没有有效方法解决这个问题,一个workaround是调用System.gc(),增加回收MappedByteBuffer对象的几率。然后sleep()几百毫秒,等待好消息。
分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第27天-01.MappedMemoryBuffer-文件内存映射缓冲区.zip

    5. **内存同步**:在使用MappedByteBuffer时,需要注意内存同步问题。由于文件映射到内存,修改内存中的内容不会立即反映到文件。只有当缓冲区被清理或文件通道关闭时,更改才会被刷新到磁盘。使用force()方法可以...

    Java NIO 应用使用内存映射文件实现进程间通信

    需要注意的是,使用内存映射文件进行进程间通信需要谨慎管理内存,确保在写入完成后正确地刷新缓冲区到文件,避免数据丢失。此外,由于文件被多个进程共享,必须同步对文件的访问,防止数据冲突。 总之,Java NIO的...

    commons-mmf.rar_java nio_java共享内存_共享内存

    Java NIO(New Input/Output)是Java标准库中提供的一种替代传统IO的高效I/O模型,它引入了通道(Channel)和缓冲区(Buffer)的概念,极大地优化了数据读写操作。...然而,使用时必须注意同步问题,以防止数据不一致。

    java对大数据量文件内容的多线程读取和排序.pdf

    - 考虑使用内存映射文件(`MappedByteBuffer`)来提高读取效率,尤其是在操作系统支持大文件的情况下。 - 如果内存允许,可以采用Bloom Filter或布隆过滤器来减少排序过程中不必要的比较,降低CPU使用。 - 使用...

    java代码优化编程共11页.pdf.zip

    4. **使用并发和多线程**:Java提供了丰富的并发库,如`ExecutorService`,可以有效地利用多核处理器,但同时需要注意线程安全问题,如使用`synchronized`关键字、`Lock`接口等。 5. **减少IO操作**:IO操作通常比...

    NIO按行读取数据

    这里使用了`MappedByteBuffer`的`map()`方法来映射文件的部分区域到内存。 - `getNextLine()`方法是核心的读取方法,根据当前块和行的计数器返回下一行。如果当前块的行已读完,会切换到下一个块并继续读取。 3. *...

    java利用替换Excel2007中sheet方式导出excel,支持大数据量

    1. 使用低内存占用的数据结构:例如,使用List而非ArrayList,避免不必要的对象创建。 2. 合理设置缓冲区大小:在写入文件时,适当增大缓冲区可以减少磁盘I/O次数。 3. 并行处理:如果数据量非常大,可以考虑使用多...

    java大字段转换

    处理大字段时需要特别注意内存管理,因为它们可能导致内存溢出(Out Of Memory)问题,影响应用的性能和稳定性。这篇博客文章可能详细探讨了如何在Java中有效地处理大字段,以及可能遇到的相关挑战。 1. **大字段...

    java-Operation-On-Files.rar_operation

    - 操作文件时要考虑并发问题,特别是在多线程环境下。 - 对于可能出现的异常,如文件不存在、权限不足等,要妥善处理,避免程序崩溃。 这个压缩包中的文档"对文件的各种操作.doc"可能包含了上述方法的具体实现和...

    javaweb 读取 classes 下的文件

    // 然后使用java.nio的FileChannel、MappedByteBuffer等进行操作 ``` 无论哪种方式,都要确保文件路径的正确性,并且考虑到部署环境的影响,因为开发环境和生产环境的类路径可能会有所不同。在处理完文件后,别忘...

    Java图片加水印,支持旋转和透明度设置.7z

    例如,可以使用内存映射文件(MappedByteBuffer)来提高读写速度,或者利用多线程并行处理。 总之,这个压缩包提供的Java代码示例旨在演示如何在图片上添加具有旋转和透明度设置的水印,这是图像处理领域的一个实用...

    五,Android文件IO详解

    要注意的是,Android为了安全考虑,对外部存储(外部SD卡)的访问需要申请相应的权限。 接下来,我们讨论一下Android特有的存储路径。Android有内部存储和外部存储两种。内部存储的数据对其他应用是私有的,而外部...

    Java NIO中四大核心组件的使用详解

    但需要注意的是,NIO的学习曲线相对较陡,理解并熟练掌握其原理和使用方式需要一定的实践。 总之,Java NIO的四大核心组件——通道、缓冲区、选择器和文件映射,提供了更灵活和高效的I/O操作方式,为开发者在处理高...

    有效率的读取大文件(2G)

    但是需要注意,如果文件过大,可能会导致内存消耗过高。 ```java RandomAccessFile raf = new RandomAccessFile("largefile.txt", "r"); FileChannel channel = raf.getChannel(); MappedByteBuffer map = channel....

    Java解析SO(ELF)文件

    在Java中,可以使用`java.nio`包的`MappedByteBuffer`类映射文件到内存,然后通过索引读取头部字段。 2. **程序头部表**:这个表包含了程序加载到内存时的信息,比如哪个段应该被加载,加载到哪里,以及段的属性。...

    文件操作工具类

    需要注意的是,如果文件正在被其他进程使用,删除操作可能会失败,这时需要处理异常。 六、更复杂的IO操作 除了基本的文件操作外,还有目录操作、文件复制、重命名、权限设置等。例如,使用`File`类的`mkdirs()`...

    文件批处理模块_java_批处理_源码

    - **移动/重命名文件**:通过`renameTo()`方法可以实现文件的移动或重命名,但要注意,如果目标文件已存在,或者源文件和目标文件位于不同驱动器上,此操作可能不成功。 3. **目录操作**: `File`类也提供了处理...

    java计数器

    8. **性能优化**:考虑到效率,可以考虑使用内存映射文件(`MappedByteBuffer`)或NIO(非阻塞I/O)来提升大文件的读写性能。 9. **设计模式**:可能应用到的设计模式有单例模式,确保全局只有一个计数器实例,以及...

    JAVA_file.rar_操作 文件

    文件的移动和重命名可以用`renameTo()`方法,但需要注意,如果目标文件已存在或者源文件和目标文件在不同驱动器上,这个方法可能失败。在这种情况下,可以考虑先删除目标文件,或者使用`Files.move()`方法,它提供了...

    读大文件Java

    在处理大文件时,务必注意监控系统资源使用情况,如CPU、内存和磁盘I/O。同时,妥善处理可能出现的IOException,防止程序意外终止。 10. **性能优化**: 可以通过调整缓冲区大小、使用直接缓冲区等技术进一步优化...

Global site tag (gtag.js) - Google Analytics