Java 取消映射或';发布';Android下的MappedByteBuffer

Java 取消映射或';发布';Android下的MappedByteBuffer,java,android,memory-management,android-ndk,mmap,Java,Android,Memory Management,Android Ndk,Mmap,Java中常见的问题是必须正确地取消内存映射文件的映射-请参阅已有14年历史的bug报告;) 但在Android上,似乎只有0个纯Java的解决方案,而且只通过NDK。这是真的吗?如果是,是否有指向带有Android/Java绑定的开源解决方案的指针?来自网站: 一种直接字节缓冲区,其内容是文件的内存映射区域 映射字节缓冲区通过FileChannel.map方法创建。此类使用特定于内存映射文件区域的操作扩展ByteBuffer类 映射的字节缓冲区及其表示的文件映射在缓冲区本身被垃圾回收之前保持有

Java中常见的问题是必须正确地取消内存映射文件的映射-请参阅已有14年历史的bug报告;)

但在Android上,似乎只有0个纯Java的解决方案,而且只通过NDK。这是真的吗?如果是,是否有指向带有Android/Java绑定的开源解决方案的指针?

来自网站:

一种直接字节缓冲区,其内容是文件的内存映射区域

映射字节缓冲区通过FileChannel.map方法创建。此类使用特定于内存映射文件区域的操作扩展ByteBuffer类

映射的字节缓冲区及其表示的文件映射在缓冲区本身被垃圾回收之前保持有效

映射字节缓冲区的内容可以随时更改,例如,如果映射文件的相应区域的内容被此程序或其他程序更改。此类更改是否发生以及何时发生取决于操作系统,因此未指定


至于我从本文中了解到的,是无法使用Android Java SDK取消映射
MappedByteBuffer
。只使用NDK,就像你说的。

Android下没有可用的黑客

但是有一些帮助程序和代码片段可以使mmap文件的C-Java绑定变得更容易:

  • Apache许可证2.0是关于Android支持的一个问题
  • 或者更容易使用像这样的工具
  • tomcat似乎拥有能够取消映射/删除mmap文件的工具
查看正在运行的,非常简单:

public class MMapTesting {

    public static void main(String[] args) throws IOException {
        File file = new File("test");
        MMapBuffer buffer = new MMapBuffer(file, 0, 1000, FileChannel.MapMode.READ_WRITE, ByteOrder.BIG_ENDIAN)) {
            buffer.memory().intArray(0, 100).set(2, 234);
        // calls unmap under the hood
        buffer.close();

        // here we call unmap automatically at the end of this try-resource block 
        try (MMapBuffer buffer = new MMapBuffer(file, FileChannel.MapMode.READ_WRITE, ByteOrder.BIG_ENDIAN)) {
            System.out.println("length: " + buffer.memory().length());
            IntArray arr = buffer.memory().intArray(0, buffer.memory().length() / 8);
            // prints 234
            System.out.println(arr.get(2));
        }
    }
}

没有官方的办法,是的。但有没有像桌面上那样的“非官方”方式?如果没有,您知道NDK解决方案的一些开源库吗?我会检查并让您知道这是问题的原因: