5〜6スレッドを作成するアプリケーションを検討してください。サイクル内の各スレッドは5MBのページサイズにMappedByteBufferを割り当てます。アプリケーションが大きなファイルで動作するときjava.nio.MappedByteBufferを使用するときにOutOfMemoryを防止する
MappedByteBuffer b = ch.map(FileChannel.MapMode.READ_ONLY, r, 1024*1024*5);
遅かれ早かれ、OOMは
java.io.IOException: Map failed at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:758)
Caused by: java.lang.OutOfMemoryError: Map failed
at sun.nio.ch.FileChannelImpl.map0(Native Method)
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:755)
が仕様によると、MappedBufferは、すぐにそれがGC自体であるとして、直接メモリを処分しなければならないスローされます。問題はMappedBuffer-sがGC-edされていて遅れてしまった後、直接メモリが終了したように見えます。
このような状況を回避するにはどうすればよいですか?おそらく、MappedBufferを暗黙的に破棄したり、MappedBufferのプールを使用したりして
のために割り当てられることをお勧めしますか? – fge
例外は** NOT OOM **ですが、IOExceptionです。仮想アドレス空間が不足しています。かなり多くのコードを表示する。マップされたバッファとJavaでのレクラメーションは、長時間の問題です(まだ解決していません)。 – bestsss