2008-11-21

OutOfMemoryError und MappedByteBuffer in Java6

Für die Referenzimplementierung des OSMBin-Dateiformates habe ich
mich der Eifnachheit halber dazu entschlossen, die Dateien einfach per
FileChannel und MappedByteBuffer in den Speicher zu mappen.

Ergebniss: Bei Dateigrößen über 50MB gibt es einen OutOfMemoryError.

Warum? Anscheinend hat Sun ein verstecktes Limit von 64MB für MappedByteBuffer eingebaut.
Dieses läßt sich mit der nicht dokumentierten Option -XX:MaxDirectMemorySize=???M
erhöhen.
Weiterhin werden MappedByteBuffer nicht immer anständig garbage-collected, so daß man vorher manuell System.gc() aufrufen muss.

Fazit: Funktioniert etwas besser aber noch nicht ganz.

Für das Mappen von einmal 220 und einmal 154MB reicht ein Limit von 3 GIGABYTE nicht mehr aus. Mehr als 3GB gehen aber auf einem Atom N270 nicht, da dieser ja nur 3GB Adressraum hat. PECH. :(

Also: Alles neu programmieren ohne MappedByteBuffer. :( Für Datenbanken ist dieses Verfahren untauglich, wobei gerade diese die Parade-Disziplin sein könnten.

Keine Kommentare: