続:memory mapped file が消せない
memory mapped file が消せないの続き。
なんか、Java APIドキュメントのFileChannel#map の項目を良く見ると、
バッファとこのバッファが示すマッピングは、バッファ自体がガベージコレクトされるまで有効です。
とか書いてやがる。で、試しに File#delete を call する前に明示的に GC するようにしてみた。
File = new File("foo.txt"); FileInputStream in = new FileInputStream(file); FileChannel channel = in.getChannel(); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); channel.close(); buffer = null; System.gc(); System.runFinalization(); if (file.delete()) { System.out.println("delete succeeded."); } else { System.out.println("delete fail."); }
すると、ファイルが消せる*1。finalize の段階でマッピングを開放しているのか?
要するにマッピングを確実に開放するには強制的に GC しろと。つうか、MappedByteBuffer に unmap() とか close() とかのメソッドがないのはなぜだ。
*1:System.runFinalization()は念のため。なくてもファイルは削除された