Da der einzige Blogbeitrag, der hir bislang jemanden interessiert hat, den Speicherbedarf von Java betrifft, hier noch ein paar grundlegende Dinge, die man beim Programmieren im Hinterkopf behalten sollte, wenn Speicher ein Problem ist:
- Es gibt in Java primitive Typen wie int, short, … – von denen kann ich vielleicht ein anderes Mal berichten.
- Interessant sind für uns erst einmal Objekte. Wenn ich ein Objekt mit new erzeuge, braucht es erst einmal Speicherplatz. Wieviel? Nun, mindestens mal den für die enthaltenen Felder. Gespeichert wird ein Objekt übrigens im Heap-Speicher.
- Außerdem will man ja gerne auf sein Objekt zugreifen können. Das geschieht mit einer Referenz. Wenn ich also Book hamlet = new Book(); ausführe, ist hamlet eine Referenz auf ein Objekt vom Typ Book, das irgendwo im Heap liegt. Und hier liegt das Problem, das ich im o.g. Posting erwähne: Bei einer 32-bit-VM braucht jede dieser Referenzen 32 bit oder eben 4 byte Platz. Das reicht aber nur, um 2^32 Byte, also 4 GB, zu adressieren (wenn man eben einzelne Bytes adressieren will). Verschiedene VMs lassen von diesen 4 GB aber unterschiedlich viel übrig – Sun bringt es aus irgendwelchen Gründen fertig, einem auf allen Systemen, die ich getestet habe, deutlich weniger als die Hälfte davon zu lassen. Bei JRockit geht es schon höher, aber je nach Betriebssystem ist eine einzelne Anwendung ohnehin auf 2-3 GB beschränkt (das gilt natürlich nur für 32-bit-Betriebssysteme; bei Interesse dazu bei Gelegenheit mehr).
- Bei einer 64-bit-VM braucht man sich de facto heutzutage über dieses Problem weniger Gedanken zu machen. Aber: Will man mehr als 4 GB nutzen, braucht jede Referenz nun doppelt so viel Speicherplatz – meines Wissens (aber dafür lege ich nicht die Hand ins Feuer) ist das bei den 64-bit-VMs von Sun immer der Fall. JRockit begnügt sich mit 32 bit, wenn die zum Adressieren des verwendeten Heap ausreichen. Im dümmsten Fall braucht man bei 32-bit-Referenzen 4,1 GB Speicher, kann den gerade so nicht mehr adressieren und muß deshalb auf 64 bit umsteigen. Und plötzlich braucht man 8 GB… (Ja, es liegen nicht nur Referenzen im Heap – aber je nach Anwendung ist eine Verdopplung schon realistisch)
- Natürlich läuft die 64-bit-VM nur auf einem 64-bit-Betriebssystem. Und das nur auf einem passenden Prozessor
- Braucht man wirklich nur den Speicher, den man mit seinen Objekten, Referenzen usw. belegt? Leider nicht, es gibt einiges an Verschnitt. Näheres demnächst; dann gehe ich kurz auf Garbage Collection und die Organisation des Speichers durch die virtuelle Maschine ein.
Disclaimer (warum ich Disclaimer nicht mag, erzähle ich euch bei anderer Gelegenheit): Ich benühe mich hier um eine verständliche Wiedergabe. Wer es genau wissen möchte, befrage eine Suchmaschine seines Vertrauens und lese die Doku der Hersteller. Wenn ich etwas Wichtiges vergessen oder einen Fehler gemacht haben sollte, möge man dies bitte einfach in einem Kommentar anmerken…