@Dave_22 Okay, fangen wir am Anfang an. Alles unter
/proc/ sind keine echten Dateien. Das sind Kernelparameter, die ins Filesystem gemappt sind. Man ändert die Wert dort nicht indem man die Datei in einem Editor öffnet. Man schreibt einfach den neuen Wert rein. In deinem Fall würde das daher so aussehen:
echo 65530 | sudo tee /proc/sys/vm/max_map_count
oder direkt als root (ohne sudo)
echo 65530 > /proc/sys/vm/max_map_count
Damit setzt du Kernelparameter zur Laufzeit. Nach einem Neustart sind die Änderungen verworfen. Du änderst hier übrigens das Pagingverhalten vom Kernel, du hast mit ziemlicher Sicherheit keine Ahnung was du hier änderst und ich würde dir daher auch empfehlen solche Änderungen nicht durchzuführen.
Zu dem eigentlichen Problem: Der Server wird beendet, weil Java nicht genügen freien Speicher zur Verfügung hat. Arbeitsspeicher überwachen ist immer ein bisschen kompliziert, da der Kernel bestimmte Dinge tun kann, die den wirklich genutzten Speicher massiv vom angezeigten Speicher abweichen lassen. Du setzt den Java Heap für jeden Server fest auf 2GB. Das heißt bei 6 Servern, sind 12 GB definitiv weg. Dazu hast du auch eine MySQL Datenbank laufen, die je nach Konfiguration ebenfalls 2-3GB verbraucht. Die genauen Parameter dafür sind aber in der Konfiguration einstellbar. Bitte ändere auch hier keine Werte, die du nicht verstehst. Auf jeden Fall solltest du dir auch mal ansehen wieviel Speicher andere Anwendungen benutzen. Das Problem hier ist, dass Linux overcommitment unterstützt. Das heißt eine Anwendung kann mehr Speicher anfordern, als eigentlich vorhanden ist. Daher ist es wichtig, dass man weiß, wie man die Nummern korrekt interpretiert. Ich empfehle für den Speichervergleich htop und dass du die Antwort in diesem Link liest und verstehst:
https://serverfault.com/questions/238302/memory-usage-numbers-in-top-htop
Das braucht unter Umständen einen Taschenrechner aber da rechnest du dir erstmal selbst aus, ob das alles passt. Wie auch davor schon erwähnt wurde braucht Java durchaus mehr als nur die 2GB, die du vorgibst.
Ansonsten gibt es noch zwei interessante Punkte, an denen du ansetzen kannst. Zuerst frage ich mich, ob die Server jedes mal beim Starten eines neuen Threads crashen oder nicht. Es wäre sehr merkwürdig, falls immer ein neuer Thread die Ursache für einen Crash ist. Passender Link dazu:
https://stackoverflow.com/questions/20030120/java-default-stack-size wobei ich auch hier glaube, dass du das verstehst und dir daher davon abrate irgendwelche Änderungen an diesem Parameter zu machen. Zuerst solltest du klären, ob jedes mal ein neuer Thread den OutOfMemoryError auslöst. Wenn der Fehler
NIE auftritt, wenn du nur 4 Server laufen lässt, dann ist das ein klares Zeichen, dass der Hauptspeicher deines Servers nicht ausreicht, denn der Heap ist durch das Maximum von 2GB immer das selbe, egal wieviele Server laufen. Das wäre allerdings sehr interessant, da keine Anwendung so viel Arbeitsspeicher anfordern sollte.
Der schnellste Weg um das Problem zu finden ist ein Heap Dump. Das ist ein extra Schalter, den man beim Starten der JVM übergeben kann. Das sorgt dafür, dass Java bei einem Speicherfehler den kompletten Heapspeicher auf die Festplatte schreibt (daher darauf achten, dass du ordentlich Speicher frei hast). Diesen Speicherdump kannst du dir dann runterladen und analysieren. Das erfordert aber dann doch schon einige Kenntnisse. Jedenfalls siehst du darin dann ganz genau welche Objekte und Datenstrukturen wie viel Speicher belegt haben und kannst daher in der Regel auch schnell die Quelle des Speicherlochs finden. Hier Hierzu:
https://stackoverflow.com/a/10944139
Software zum Analysieren eines Heap Dumps:
http://www.eclipse.org/mat/ (oder andere Software einer Wahl, Google ist dein Freund).