【发布时间】:2016-11-11 10:11:44
【问题描述】:
我刚刚在我的 opensrc 库代码中遇到一个错误,该代码分配了一个大缓冲区来修改一个大的 flac 文件,该错误只发生在使用 Java 1.8.0_74 25.74-b02 32bit 的具有 3Gb 内存的旧 PC 机器上
原来我只是分配一个缓冲区
ByteBuffer audioData = ByteBuffer.allocateDirect((int)(fc.size() - fc.position()));
但有一段时间我把它当作
MappedByteBuffer mappedFile = fc.map(MapMode.READ_WRITE, 0, totalTargetSize);
我的(错误)理解是映射缓冲区比直接缓冲区使用更少的内存,因为整个映射缓冲区不必同时在内存中,只有正在使用的部分。但是这个答案说使用映射字节缓冲区是一个坏主意,所以我不清楚它是如何工作的
Java Large File Upload throws java.io.IOException: Map failed
完整代码见here
【问题讨论】:
-
它失败了,因为它无法在 32 位上分配那么多 地址 空间。这与物理 RAM 不足无关。
-
但是文件大小只有200mb,应该没问题
-
你不能确定,它需要一个这样大小的连续块。
-
啊,好吧,你确定从那个错误中知道它是地址空间错误还是如果实际上没有足够的可用内存,你会得到同样的错误
-
因为
mmap应该只是重新映射已经加载到系统缓存中的内存页面,所以这不太可能。
标签: java mappedbytebuffer