4

From what I've read, it's a bit tricky closing a memory mapped file in Java.

By default, they're closed only by a mechanism akin to (but more efficient than) finalization.

I already know it's possible to close them explicitly in an implementation-specific way (but one common to both OpenJDK and the Oracle JDK) by using reflection, using the following code (inspired by this answer to a related question):

try {
    Method cleanerMethod = buffer.getClass().getMethod("cleaner");
    cleanerMethod.setAccessible(true);
    Object cleaner = cleanerMethod.invoke(buffer);
    Method cleanMethod = cleaner.getClass().getMethod("clean");
    cleanMethod.setAccessible(true);
    cleanMethod.invoke(cleaner);
} catch(Exception ex) { /* log exception */ }

I gather from the discussion in that question that it's not reliably possible to delete the backing file for a MappedByteBuffer without closing the buffer in this manner.

However, there are also other, related resources that must be closed: the RandomAccessFile and the FileChannel that were used to create the MappedByteBuffer.

Does the order in which these resources are closed matter? Are there any differences between the order in which they must be closed on Mac/Windows/Linux?

Ultimately, what I want to know how to do safely comes down to these two questions:

What is the correct way to close a MappedByteBuffer (and related resources) and ensure the backing file is saved?

Is there a way to close a MappedByteBuffer (and related resources) without accidentally causing it to write uncommitted changes to the disk, when the goal is to quickly delete the backing file?

Community
  • 1
  • 1
Theodore Murdock
  • 1,538
  • 1
  • 13
  • 28

0 Answers0