Ich arbeite kürzlich an einem Programm für Java. Ursprünglich mochte ich Javas Speicherverwaltung immer, man muss sich keine Sorgen um die Speicherzuweisung machen, einfach zuweisen, der Garbage Collector bekommt den Speicher für dich zurück. Das Programm wird nun mit einer großen Datenmenge entwickelt, und der Geschwindigkeit halber werde ich alle Informationen in den Speicher laden, was eine schnelle Antwort gewährleistet. Ich zähle immer wieder den Speicher und denke über meine eigene Datenmenge nach, was am Anfang ausreichen sollte (mein Rechner hat 4G-Speicher, obwohl Windows 3,5G erkennt, aber das sollte im Vergleich zu meinem aktuellen Datenvolumen in Ordnung sein).
Unerwartet lief das Programm des ersten Experiments einige Stunden und traf auf eine Ausnahme aus dem Gedächtnis. Wenn ich mir meine eigenen VM-Einstellungen anschaue, habe ich -Xms512M -Xmx1024M gesetzt. Ohne darüber nachzudenken, habe ich es direkt auf -Xms512M -Xmx2048M geändert, und das Ergebnis war, dass ich nicht genug Platz für den Objekt-Heap reservieren konnte. Das Programm kann nicht aufstehen. Erst dann wurde mir klar, dass es immer noch eine Grenze für den ursprünglichen maximalen Speicher gab. Ich suchte im Internet und fand viele Artikel, die dieses Thema behandelten. Schließlich habe ich den nützlichsten Artikel im DEV2DEV-Forum von BEA gefunden
Hier führte Moderator YuLimin den Test durch und kam zu dem Schluss:
Unternehmen JVM-Version Maximaler Speicher (Mega) Client Maximaler Speicher (Mega) Server
SO 1.5.x 1492 1520
SUN 1.5.5(Linux) 2634 2660
SO 1.4.2 1564 1564
SUN 1.4.2(Linux) 1900 1260
IBM 1.4.2(Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Ich benutze JDK1.6.0_05 gerade, habe es getestet. Das Hauptproblem im Client-Zustand ist, dass mein JDK den -Server-Parameter nicht erkennt und den Serverzustand nicht testen kann. Die Schätzungen sind ungefähr gleich.
SO 1.6.0 1442 N/a
Es scheint, dass es unmöglich ist, großen Speicher in Java zu verwenden. Und das allgemeine Sprichwort ist, dass die Müllabfuhrzeit lang sein wird, wenn der Speicher zu groß ist. Das ist auch verständlich, da man in der Regel gesammelt wird, wenn der Speicher nicht ausreicht, das Scannen von 2G-Speicher natürlich viel langsamer ist als 1G, und es gibt mehr Speicherobjekte, die geschätzte Beziehung steigt exponentiell.
Im Folgenden sind YuLimins Testmethoden und Testunterlagen angehängt.
Testmethode: Verwenden Sie den Befehl java -XmxXXXXM -version, um auf der Kommandozeile zu testen, und erhöhen Sie dann allmählich den Wert von XXXX; wenn es normal läuft, bedeutet das, dass die angegebene Speichergröße verfügbar ist, andernfalls wird eine Fehlermeldung ausgedruckt. |