Ich habe eine Java-8-Anwendung, die in Nachrichten über das Netzwerk nimmt und schreibt auf mehrere Memory Mapped-Dateien Java NIO MappedByteBuffer verwenden. Ich habe einen Leser, der Nachrichten gleichzeitig aus diesen Dateien liest und gelöschte Dateien mit MappedByteBuffer wieder löscht. Alles ist glatt, bis ich geschrieben habe, und über 246 GB Daten und meine Anwendung abstürzt mit dem folgendenJava 8 Anwendung, die den gesamten System-RAM verwendet und dann mit einem SIGBUS abstürzt. Was ist denn hier los?
[thread 139611281577728 also had an error][thread 139611278419712 also had an error][thread 139611282630400 also had an error][thread 139611277367040 also had an error][thread 139611283683072 also had an error][thread 139611279472384 also had an error]
[thread 139611280525056 also had an error]
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGBUS (0x7) at pc=0x00007f02d10526de, pid=44460, tid=0x00007ef9c9088700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_101-b13) (build 1.8.0_101-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode linux-amd64)
# Problematic frame:
# v ~StubRoutines::jint_disjoint_arraycopy
#
# Core dump written. Default location: /home/user/core or core.44460
#
# An error report file with more information is saved as:
# /home/user/hs_err_pid44460.log
Die hs_err_pid44460.log
ist leer und die Core-Dumps core.44460
ist etwa 246 GB groß und voll von den Nachrichten, die ich gelesen bin versuchen zu schreiben.
ich mit einer Max-Heap-Größe von 32 GB leite. Laut JConsole habe ich keinen Free Physical Memory
mehr und stürze dann ab.
Warum habe ich keinen RAM mehr? Vergesse ich, einen Datei-Handle zu schließen/meine MMapped-Dateien nicht korrekt zu schließen?
Die Lösung bestand darin, den 'Cleaner' zu verwenden, um die Arbeit zu erledigen. Insbesondere das half -> http://Stackoverflow.com/a/19447758/1041963 –
Beachten Sie, dass die Verwendung des Cleaners falsch zu Abstürzen führen kann und eine interne API ist, die von Version zu Version – the8472
@the8472 wechseln kann, Sie haben Recht, speziell für API-Änderungen. Ich werde versuchen, meine Antwort so schnell wie möglich mit einigen Anweisungen für Java9 zu aktualisieren, die anfangen, die Angelegenheit von "intern" zu klären (noch weit verbreitet!) APIs, siehe auch: http://openjdk.java.net/jeps/260 – logtwo