Was Abgebildet wird, die Puffer-Pool - / Direct-Puffer-Pool, und wie zu erhöhen Sie Ihre Größe?
Screenshot von VisualVM genommen wurde, wenn ich lief ein IO-intensive JVM-Programm (geschrieben in Scala), heap-Größe von 4 GB nur 2 GB waren in Verwendung. Die JVM-Programm benutzt memory-mapped-Datei.
Was bedeutet "gemappt" buffer pool" und "direct buffer pool" bedeuten?
Diejenigen, die pools scheinen zu sein, sehr voll. Da die JVM-Programm benutzt memory-mapped-Datei, sehe ich die erhöhte Leistung, wenn die pools waren größer? Wenn dem so ist, wie zu erhöhen Sie Ihre Größe?
Die Größe aller zugeordneten Dateien sind etwa 1,1 GB groß.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Direkten Puffer
Einen direct buffer ist ein Stück der Speicher ist in der Regel verwendet, um Java-Schnittstelle der OS-I/O-Subsysteme, zum Beispiel als einen Ort, an dem das Betriebssystem schreibt Daten erhält es von einem socket oder der Festplatte ist, und von dem Java können direkt gelesen.
Austausch der Puffer mit der OS ist viel effizienter als der ursprüngliche Ansatz des Kopierens von Daten von der OS in Java-memory-Modell, die macht dann die Daten unterliegen der Garbage Collection und Ineffizienzen, wie die re-kopieren der Daten, wie Sie wandert aus eden -> survivor -> fest -> der permanenten generation.
In der Abbildung haben Sie nur einen buffer von 16 KB, der direkten Puffer. Java wächst dieser pool als erforderlich, so dass die Tatsache der Blaue Bereich ist an der Oberseite des Blocks ist lediglich ein statement, dass alle Puffer Speicher so weit im Einsatz ist. Ich sehe das nicht als ein Problem.
Zugeordneten Puffer-pool
Dem zugeordneten Puffer-pool ist, der gesamte Speicher von Java für seine FileChannel Instanzen.
Jeder FileChannel-Instanz hat einen Puffer, die gemeinsam mit der OS (ähnlich wie bei der direkten Puffer mit der Effizienz, die Vorteile). Der Speicher ist im wesentlichen eine RAM-Fenster auf einen Teil der Datei. Je nach Modus (Lesen, schreiben oder beides), kann Java Lesen und/oder ändern Sie den Inhalt der Datei direkt und das OS kann direkt Daten bereitstellen, oder Spülen Sie die geänderten Daten auf der Festplatte.
Zusätzliche Vorteile dieses Ansatzes ist, dass die OS-flush kann diesen Puffer direkt auf die Festplatte, wie Sie es für richtig hält, wie wenn das OS wird heruntergefahren, und das OS kann die Sperre, die Teil der Datei von anderen Prozessen auf dem computer.
Screenshot zeigt an, dass Sie über 680MB im Einsatz von 12 FileChannel-Objekte. Wieder Java wird wachsen, das ist Scala mehr braucht (und die JVM kann zusätzliche Speicher vom OS), so dass die Tatsache, dass alle 680MB ist alles nicht wichtig. In Anbetracht Ihrer Größe, es scheint mir, dass das Programm bereits optimiert worden, um die Verwendung dieser Puffer effektiv.
Erhöhung der Größe des zugeordneten Puffers pool
Java reserviert Speicher außerhalb des Garbage Collection-Platz für den FileChannel-Puffer. Dies bedeutet, dass die normale heap-Größe-Parameter wie
-Xmx
sind hier nicht wichtigDie Größe des Puffers in einem FileChannel mit der anzeigen Methode. Ändern dies würde bedeuten, ändern Sie Ihre Scala-Programm
Ist der buffer hat die Größe einen Schwellenwert erreicht, der um 10s-100s KB, Erhöhung der FileChannel-Puffer-Größe möglicherweise oder möglicherweise nicht die Leistung erhöhen - es hängt davon ab, wie das Programm verwendet die Puffer:
Versuchen profiling der Anwendung und suchen für die I/O waits (Jprofiler und YourKit sind gut). Kann es sein, dass die Datei-I/O ist nicht wirklich ein problem - seien Sie nicht ein Opfer von vorzeitige Optimierung. Wenn I/O wartet, sind ein erheblicher Teil der insgesamt verstrichenen Zeit, dann könnte es sich lohnen, zu versuchen, eine größere Puffergröße
Weitere Informationen
https://blogs.oracle.com/alanb/entry/monitoring_direct_buffers
Sich auch bewusst sein, dass es einen Fehler gemeldet, der auf der JVM sagen, dass FileChannel ist nicht gut auf das freigeben von Speicher. Es ist detailliert in Verhindern OutOfMemory bei der Verwendung von java.nio.MappedByteBuffer