Ich habe einige Posix-Programme geschrieben, die den gemappten Dateipuffer verwenden. Ein einfaches Szenario besteht darin, eine 1-GB-Datei in den Speicher zu mappen und die gesamte Datei mit Inhalt aufzufüllen.
Während der Programmausführung gab es wenig bis keine Festplatten-IO, bis msync
oder munmap
ruf passiert.
Auf genau demselben System habe ich das entsprechende Programm in Java geschrieben, das auf Oracle JDK 7 läuft, und festgestellt, dass während der gesamten Programmausführung eine große Menge von IO-Aktivitäten auf dem Datenträger auftauchen.
Wie wird der Memory-Mapped-Dateipuffer in JVM anders implementiert? Und gibt es überhaupt eine Verzögerung der massiven IO-Aktivitäten?
Das Betriebssystem ist ein Linux 3.2 x64.
Code:
%Vor% Die Speicherzuordnung ist vollständig im Betriebssystem implementiert. Die JVM hat keinen Einfluss darauf, wie sie auf die Festplatte geleert wird, außer durch die Optionen force()
und "rws"
, wenn Sie die Datei aktivieren.
Linux wird basierend auf den Kernel-Parametern, die in sysctl gesetzt sind, auf die Festplatte geschrieben.
%Vor% Dies sind die Standardeinstellungen meines Laptops. Das Verhältnis 10
bedeutet, dass es beginnt, die Daten auf die Festplatte im Hintergrund zu schreiben, wenn 10% des Hauptspeichers verschmutzt sind. Das Zurückschreiben von 20% bedeutet, dass das Schreibprogramm stoppt, bis der schmutzige Prozentsatz unter 20% fällt. In jedem Fall werden die Daten nach 3000 Zenti-Sekunden oder 30 Sekunden auf die Festplatte geschrieben.
Ein interessanter Vergleich, um eine Datei auf einem tmpfs
Dateisystem zu speichern. Ich habe /tmp
gemounted als tmpfs, aber die meisten Systeme haben / dev / shm.
BTW Sie könnten diese Klasse interessant finden. MemoryStore ermöglicht Sie können jede Speichergröße abbilden, dh & gt; & gt; 2 GB und führen Sie eine thread-sichere Bedienung darauf durch. z.B. Sie können den Speicher über Prozesse hinweg freigeben. Es unterstützt Off-Heap-Sperren, flüchtiges Lesen / Schreiben, Ordered Write und CAS.
Ich habe einen Test, bei dem zwei Prozesse Datensätze sperren, umschalten und entsperren. Die Latenz beträgt im Durchschnitt 50 ns auf meinem Laptop.
BTW2: Linux verfügt über Sparse-Dateien, was bedeutet, dass Sie Regionen zuordnen können, die nicht nur größer als Ihr Hauptspeicher sind, sondern auch größer als Ihr freier Speicherplatz. z.B. Wenn Sie 8 TB zuordnen und nur zufällige Stücke von 4 GB verwenden, werden bis zu 4 GB im Speicher und 4 GB auf der Festplatte verwendet. Wenn Sie du {file}
verwenden, können Sie den tatsächlich verwendeten Speicherplatz sehen. Hinweis: Die zu geringe Zuweisung von Festplattenspeicher kann zu stark fragmentierten Dateien führen, was ein Performance-Problem für die Festplatte darstellen kann.
Tags und Links java memory file-io linux performance