Verhindern OutOfMemory bei der Verwendung von java.nio.MappedByteBuffer

Betrachten-Anwendung, die 5-6 threads, jeder thread in dem Zyklus zuordnen MappedByteBuffer für 5mb die Größe der Seite.

MappedByteBuffer b = ch.map(FileChannel.MapMode.READ_ONLY, r, 1024*1024*5);

Früher oder später, wenn die Anwendung funktioniert mit großen Dateien, oom ausgelöst

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)

Laut Spezifikation, MappedBuffer entsorgen sollte direct-memory-sobald es die GC selbst. Sieht aus wie das problem ist, dass MappedBuffer-s GC-ed zu spät, später dann direct memory fertig.

Wie Sie diese situation vermeiden ? Wahrscheinlich sagen MappedBuffer zu entsorgen implizit oder verwenden Sie eine Art pool von MappedBuffer

  • Durch Neugier, was Ihr code tun?
  • Die Ausnahme ist NICHT OOM aber IOException. Sie sind der virtuelle Adressraum. Zeigen Sie ein bisschen mehr code. Die zugeordneten Puffer und Rückgewinnung in java ist eine lange Zeit, Fragen (immer noch ungelöst aus)
InformationsquelleAutor user12384512 | 2011-12-18
Schreibe einen Kommentar