5 Stimmen

Speichernutzung von FileChannel#map

Hat FileChannel#map den gesamten für die resultierende Datei benötigten Speicherplatz zuweisen ByteBuffer sofort zugewiesen, oder wird sie nur bei Bedarf während des Lesens aus dem Puffer zugewiesen?

Ich habe gerade versucht, eine 500+ MB große Datei in einem trivialen Testprogramm vollständig abzubilden, und habe mir den Speicherverbrauch des Prozesses angesehen. (Mit beiden Runtime#totalMemory und in der OS X-Aktivitätsanzeige nach einem groovysh-Prozess zu suchen). Die Speichernutzung überstieg nie 30 MB.

Könnte eine Java-Implementierung also einen Teil ihres Speicherverbrauchs in nativen Aufrufen "verstecken"? Und wenn ja, gibt es eine Möglichkeit, herauszufinden, wie viel das unter OS X ist?

5voto

Tom Hawtin - tackline Punkte 142461

Die Speichernutzung ist nie ganz einfach. Der tatsächliche Puffer, der von FileChannel.map ist nicht Teil des Java-Heaps. In der Tat kann der Speicher mit anderen Prozessen geteilt werden. Die Datei kann nicht einmal von der Festplatte gelesen werden, bevor die Seiten berührt werden.

0 Stimmen

Ich bin mir da nicht so sicher, auf einigen Betriebssystemen (WinXP-32) scheint es so, als ob eine gewisse Menge an Puffer vom Java-Heap verbraucht wird. Ich habe einen Test, wo verbrauchen viel Java Heap begrenzt die Menge der festen (max) Größe nio MemoryMappedBuffers ich erstellen kann.

0 Stimmen

@Justin Ich bin mir nicht sicher, wie das funktionieren soll. Offensichtlich ist die Buffer Objekt selbst befindet sich im Java-Heap, und es gibt weitere kleine Objekte, die sich auf die Dateizuordnung beziehen, und vielleicht einige transiente Objekte. Haben Sie einen kurzen Test oder Zahlen?

0 Stimmen

Nicht speziell für die Bestimmung von Zahlen - es war eine Seite Beobachtung auf einen anderen Test, seine alle JVM abhängig offensichtlich. Versuchen Sie, eine große (4g) Datei zu erstellen und sie in (1024*1024*64 b) Segmenten abzubilden. Die Anzahl der Segmente scheint davon abhängen, wie groß der JVM-Heap ist verbraucht durch andere Objekte in der JVM, nicht notwendigerweise, wie viel verfügbar ist.

1voto

kohlerm Punkte 2576

Ja. Er ist nicht Teil des Heaps. Dennoch wird je nach Betriebssystem immer noch Speicher reserviert sein. Unter OS X, da es UNIX-ähnlich ist, sollten Sie in der Lage sein, top oder ps zu benutzen, um zu überprüfen, wie viel Speicher er benötigt.

1voto

yetanothercoder Punkte 1689

Java.nio.MappedByteBuffer#load löst das Laden des gesamten Dateiinhalts in den Speicher aus (andernfalls erfolgt es auf Anforderung):

Diese Methode versucht nach bestem Wissen und Gewissen sicherzustellen, dass bei der Rückgabe, * der Inhalt dieses Puffers im physischen Speicher vorhanden ist. Das Aufrufen dieser * Methode kann zu einer gewissen Anzahl von Seitenfehlern und E/A-Operationen * auftreten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X