Informationen zum Verhalten beim Erstellen einer Dateizuordnung mit Java

Informationen zum Verhalten beim Erstellen einer Dateizuordnung mit Java

Ich habe das Verhalten bei der Dateizuordnung in Java untersucht und werde es daher zusammenfassen.

Umgebung CentOS7.3.1611, openjdk-1.8.0.131

Sie können den Systemaufruf open + mMap in der Sprache C verwenden, um Dateien dem Speicher zuzuordnen, aber ich war immer besorgt darüber, ihn in Java zu verwenden. Ich werde es tatsächlich versuchen.

Bewerten Sie mit den folgenden Quellen.

mmap01.java


import java.lang.Thread;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class mmap01
{
  public static void main(String[] args) throws Exception
  {
    for (int argc = 0; argc < args.length; argc++ ) {
      File file = new File(args[argc]);
      long length = file.length();

      System.out.println("file:" + args[0] + "  size:" + length);
      MappedByteBuffer in = new RandomAccessFile(file, "r")
                                .getChannel().map(FileChannel.MapMode.READ_ONLY, 0, length);
      for (long i = 0; i < length; i++) {
        in.get();
      }
      System.out.println("Finished reading");
    }
    System.out.println("wait");
    Thread.sleep(1000000);
  }
}

Lassen Sie es uns tatsächlich abbilden.

Übrigens tritt im Fall einer Datei, die Integer.MAX_VALUE (2 ^ 31) überschreitet, der folgende Fehler zum Zeitpunkt der Zuordnung auf. Ich konnte mit einer Größe von 2 ^ 31-1 abbilden.

$ dd if=/dev/zero of=2gb bs=1 seek=2147483647 count=1
$ dd if=/dev/zero of=2gb-1 bs=1 seek=2147483646 count=1
$ dd if=/dev/zero of=2gb-2 bs=1 seek=2147483645 count=1
$ java mmap01 2gb
file:2gb  size:2147483648
Exception in thread "main" java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
	at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:869)
	at mmap01.main(mmap01.java:17)
$ java mmap01 2gb-1
file:2gb-1  size:2147483647
Finished reading
wait

Zu diesem Zeitpunkt sind der Speicherzuordnungsstatus des Java-Prozesses und der Java-Status wie folgt. Es scheint mit mmap abgebildet zu sein. Aus den jstat-Ergebnissen geht hervor, dass sich der zugeordnete Bereich außerhalb des Heaps befindet.

$ cat /proc/$(pidof java)/maps
(Abkürzung)
7f97c8000000-7f9848000000 r--s 00000000 00:26 5                          /mnt/hgfs/COMMON/Java_Mmap/2gb-1
(Abkürzung)
$ jstat -gc $(pidof java)
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1024.0 1024.0  0.0    0.0    8192.0   671.9    20480.0      0.0     4480.0 866.3  384.0   73.9       0    0.000   0      0.000    0.000

Was passiert, wenn mehrere Dateien zugeordnet sind?

$ java mmap01 2gb-1 2gb-2
file:2gb-1  size:2147483647
Finished reading
file:2gb-1  size:2147483646
Finished reading
wait

Beide Dateien sind ordnungsgemäß zugeordnet. Der Heap hat sich nicht so stark vergrößert wie der Bereich (2 ^ 31-2), der zusätzlich gelesen wurde.

$ cat /proc/$(pidof java)/maps
(Abkürzung)
7fd08c000000-7fd10c000000 r--s 00000000 00:26 6                          /mnt/hgfs/COMMON/Java_Mmap/2gb-2
7fd10c000000-7fd18c000000 r--s 00000000 00:26 5                          /mnt/hgfs/COMMON/Java_Mmap/2gb-1
(Abkürzung)
$ jstat -gc $(pidof java)
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1024.0 1024.0  0.0    0.0    8192.0   835.7    20480.0      0.0     4480.0 866.3  384.0   73.9       0    0.000   0      0.000    0.000

Warum haben wir dennoch ein Limit von 2 GB für das kartierbare Gebiet festgelegt? Es ist auch schwierig zu handhaben, da es keine explizite Methode zum Aufheben der Zuordnung gibt. Hinweise zum DirectByteBuffer- und Leistungsvergleich enthält auch eine Beschreibung der Version.

Referenz

Recommended Posts

Informationen zum Verhalten beim Erstellen einer Dateizuordnung mit Java
Wenn eine mit dem Atom-Editor erstellte Java-Datei bei der Ausführung an der Eingabeaufforderung verstümmelt wird
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Erstellen Sie mit dem Befehl eine JAR-Datei
[Java] Erstellen Sie mit dem Befehl jar eine JAR-Datei, die sowohl komprimiert als auch nicht komprimiert ist
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Eine Geschichte über das JDK in der Java 11-Ära
Die Geschichte des Versuchs, JAVA File zu bedienen
Erstellen Sie eine Mehrschlüsselkarte mit einer Standardbibliothek
Über die Kartenmethode
Überprüfen Sie das Verhalten von Java Intrinsic Locks mit bpftrace
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
[Java] Beim Schreiben der Quelle ... Memorandum ①
Eine Geschichte über die Entwicklung von ROS namens Rosjava mit Java
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
Beim Hochladen einer Datei mit Spring Boot wird eine Fehlerbehandlung durchgeführt, wenn die maximale Dateigröße überschritten wird.
Hinweise zum Umfang
[Java] Erstellen Sie eine temporäre Datei
Fehler beim Spielen mit Java
Ich habe versucht, eine PDF-Datei mit Java part2 zu verarbeiten
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
Wie gehe ich mit dem Typ um, den ich 2 Jahre lang über das Schreiben eines Java-Programms nachgedacht habe?
Erstellen Sie einen einfachen Webserver mit der Java-Standardbibliothek com.sun.net.httpserver
Über das, was ich beim Erstellen einer CLJ-Datei mit Clojure getan habe
Lesen Sie die Datei unter dem Klassenpfad als Zeichenfolge mit spring
Ersetzen Sie durch einen Wert entsprechend der Übereinstimmung mit einem regulären Java-Ausdruck
Eine Geschichte über die Schwierigkeit, ein Testframework an Java 6 auszurichten
Der Suchtpunkt bei der Durchführung der Basisauthentifizierung mit Java URLConnection
Überschreiben Sie den gleichnamigen Upload mit dem BOX SDK (Java).
[Gradle] Erstellen Sie ein Java-Projekt mit einer Konfiguration, die von der Konvention abweicht
Über das Verhalten von Ruby Hash # ==
Erstellen eines Java-Projekts mit Gradle
Erfahren Sie mehr über Transaktionssicherungspunkte (mit Java)
Führen Sie eine Batchdatei von Java aus
Entpacken Sie die Zip-Datei in Java
Informationen zur aktuellen Entwicklungsumgebung (Java 8)
Erstellen Sie eine Listenkarte mit LazyMap
Folgen Sie dem Link mit Selen (Java)
Beispiel für eine EXCEL-Dateiaktualisierung mit JAVA
Informationen zur Dateikopierverarbeitung in Java
Java8-Listenkonvertierung mit Stream Map
[IntelliJ IDEA] So fügen Sie beim Speichern einer Java-Datei automatisch final hinzu
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
Lassen Sie uns das Ergebnis der Analyse von Java-Bytecode in einem Klassendiagramm ausdrücken
Erstellen Sie eine U-Bahn-Karte von Tokio aus der CSV-Datei von station data.jp
Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
[Java small story] Überwachen Sie, wann der Liste ein Wert hinzugefügt wird
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
Informationen zum Festlegen des Gültigkeitszeitraums beim Speichern des Caches in Redis mit Spring Cache
<java> Teilen Sie die Adresse vor und nach der Adresse mit einem regulären Ausdruck
Entschlüsseln Sie die gesamte Bean in einer Eigenschaftendatei mit einigen verschlüsselten Werten
[Java] Holen Sie sich MimeType aus dem Inhalt der Datei mit Apathce Tika [Kotlin]
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Bei der Suche nach mehreren in einem Java-Array