Wie oben erwähnt, sollte der standardmäßige (komprimierende) Garbage Collector (GC) gut funktionieren, wenn Sie ein nicht interaktives Programm haben. Wenn Sie ein interaktives Programm haben und (1) nicht schneller Speicher zuweisen, als der GC mithalten kann, und (2) keine temporären Objekte (oder Sammlungen von Objekten) erstellen, die zu groß sind (im Verhältnis zur Gesamtsumme) maximaler JVM-Speicher), damit der GC umgehen kann, dann ist CMS für Sie.
Sie haben Probleme, wenn Sie ein interaktives Programm haben, bei dem der GC nicht genügend Raum zum Atmen hat. Das gilt unabhängig davon, wie viel Speicher Sie haben, aber je mehr Speicher Sie haben, desto schlimmer wird es. Dies liegt daran, dass CMS nicht genügend Arbeitsspeicher zur Verfügung steht, wenn der Arbeitsspeicher zu niedrig ist, während die komprimierenden GCs (einschließlich G1) alles anhalten, bis der gesamte Arbeitsspeicher auf Müll überprüft wurde. Diese Stop-the-World-Pause wird größer, je mehr Speicher Sie haben. Vertrauen Sie mir, Sie möchten nicht, dass Ihre Servlets länger als eine Minute pausieren. Ich habe eine detaillierte StackOverflow-Antwort zu diesen Pausen in G1 geschrieben.
Seitdem ist meine Firma zu Azul Zing gewechselt. Es kann immer noch nicht mit dem Fall umgehen, dass Ihre App wirklich mehr Speicher benötigt als Sie haben, aber bis zu diesem Moment läuft es wie ein Traum.
Aber natürlich ist Zing nicht kostenlos und seine spezielle Sauce ist patentiert. Wenn Sie weit mehr Zeit als Geld haben, schreiben Sie Ihre App neu, um einen Cluster von JVMs zu verwenden.
Am Horizont arbeitet Oracle an einem Hochleistungs-GC für Multi-Gigabyte-Heaps. Ab heute ist dies jedoch keine Option.