Java RAM Management

OnDemand

Top Contributor
Hallo zusammen,

hat jemand eine gute und verständliche Resource, wie Java mit RAM umgeht?

Hab das Problem, dass meine Services laufen immer voller und voller, als ob da keine alten Objekte entfernt werden. Der RAM steigt bis das OS den Prozess killt.
Nun muss ich mich da irgendwie mal einlesen in das Thema.
 

White_Fox

Top Contributor
Hast du mal den GC gerufen?

Wenn die alten Objekte nicht entfernt werden würde ich mal schauen ob die wirklich herrenlos werden und nicht noch in irgendeiner Collection vor sich hingammeln...so oder so ähnlich klingt das jedenfalls für mich.

PS: Das Thema GC hatten wir hier vor einiger Zeit schon einmal, vielleicht findest du ihn ja. Irgendwer schrieb da dazu, daß der ganze GC-Kram von der jeweiligen JVM-Implementatin abhängt (was eigentlich auch logisch ist).
Sprich: Ob es da so viel zu lesen gibt außer Doku und Quellcode von deiner konkreten Implementation wird wohl fraglich sein.
 

mrBrown

Super-Moderator
Mitarbeiter
Grundsätzlich zu GCs: http://www.angelikalanger.com/Articles/EffectiveJava/49.GC.GenerationalGC/49.GC.GenerationalGC.html (gesamte Serie lesen, unten stehen dort die Links)


Wenn der RAM kontinuierlich voller wird, gibt es entweder ein Memory-Leak (also, irgendwo hängen noch Referenzen, und werden nicht aufgeräumt), oder der GC hat einfach nie aufgeräumt – ersteres ist meistens das deutlich wahrscheinlichere.

Wenn bei dir der Prozess gekillt wird, ohne das vorher ein Haufen Exceptions fliegt, könnte es an falsch eingestellten Limits liegen. Aus JVM-
Sicht gibt es noch genug freien Speicher, aus OS-Sicht nicht – der GC läuft also nicht, der Prozess wird aber trotzdem gekillt.

Auf die Spur kommst du dem nur mit Logging und Monitoring. Kannst für den Anfang zB Start-Paratemeter ausgeben lassen (zum Überprüfen der Memory-Limits) und GC-Logging aktivieren, dann siehst du zumindest was der GC macht. Nächstes wäre dann Monitoring mit zB Visual VM, darüber kann man Memory-Leaks finden.
 

mrBrown

Super-Moderator
Mitarbeiter
Hast du mal den GC gerufen?
Der "per Hand" rufen ist fast immer die falsche Wahl – aus Speicher-Verbrauchs-Sicht macht es für die JVM selbst keinen Unterscheid, bevor der Speicher voll ist, würde die sowieso selbst aufräumen, und aus Performance-Sicht ist es meistens eher ein Nachteil, da die damit angestoßene GC üblicherweise länger braucht als eine automatische (weil mehr aufgeräumt wird), beides kann sich aber je nach GC auch unterscheiden. Und wirklich garantiert anstoßen kann man sie eh nicht, die JVM darf das auch einfach ignorieren.
 

LimDul

Top Contributor
Hoffentlich nicht, das ist eigtl nie nötig.

Der Parameter -XX:+HeapDumpOnOutOfMemoryError könnte bei der Fehlersuche evtl. helfen
Ich klink mich mal ein - würde sowas auch bei einem JBoss helfen? Nach X Deployments geht der Regelmässig mit einen OutOfMemoryError - OutOfMetaspace auf die Bretter. Das kann ja eigentlich kein Anwendungscode sein, weil die Anwendung ja jedes mal neu deployed wird.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich klink mich mal ein - würde sowas auch bei einem JBoss helfen? Nach X Deployments geht der Regelmässig mit einen OutOfMemoryError - OutOfMetaspace auf die Bretter. Das kann ja eigentlich kein Anwendungscode sein, weil die Anwendung ja jedes mal neu deployed wird.
Wenn ich mich recht erinnere umfasst der HeapDump dabei wirklich nur den Java-Heap,


Wenn ich raten müsste tritt das auch, wenn die Anwendung oft genug redeployed wird, aber nicht "einfach so" wenn die Anwendung einfach nur lang unter Last läuft?
Das ist am ehesten ein Class-Unloading-Problem tief irgendwo in JBoss selbst, da kann man vermutlich kaum mehr machen, als das zu melden und zu hoffen.
Hilfreich könnte aber u.U. dies: https://stackoverflow.com/a/37933050, ich würde aber erwarten, das es am ehesten das obige bestätigt.

EDIT: vielleicht auch interessant: https://stackoverflow.com/a/38875640
 

LimDul

Top Contributor
Wenn ich mich recht erinnere umfasst der HeapDump dabei wirklich nur den Java-Heap,


Wenn ich raten müsste tritt das auch, wenn die Anwendung oft genug redeployed wird, aber nicht "einfach so" wenn die Anwendung einfach nur lang unter Last läuft?
Das ist am ehesten ein Class-Unloading-Problem tief irgendwo in JBoss selbst, da kann man vermutlich kaum mehr machen, als das zu melden und zu hoffen.
Hilfreich könnte aber u.U. dies: https://stackoverflow.com/a/37933050, ich würde aber erwarten, das es am ehesten das obige bestätigt.

EDIT: vielleicht auch interessant: https://stackoverflow.com/a/38875640
Jepp, nur durch Redeployed - Laufen tut die Anwendung stabil. Danke für die Links, mal schauen ob ich im Projekt mal genug Luft habe tiefer reinzuschauen was der bei uns tut. Es ist halt nervend aber kein echtes Problem (Lokal startet man den JBoss eh regelmäßig neu und auf den Testsystemen mit Autodeployment über Jenkins muss ich mich halt 1x die Woche einloggen auf dem Server und den JBoss neustarten)
 

OnDemand

Top Contributor
Danke euch :) Der Heapdump zeigt an, welche Objekte noch rum liegen oder?

Wann ist der GC der Meinung ein Objekt zu entfernen? Eigentlich wenn es NULL ist oder? Hab viele Hashmaps und Listen, ich vermute die verwirft er nicht, da diese niemals NULL werden, was aber nach dem abarbeiten der List / Map gern passieren kann
 

LimDul

Top Contributor
Der GC darf nur Objekte verwerfen, die nicht mehr stark referenziert werden. Das hat nix direkt mit null werden zu tun.

Sprich, wenn es in deiner Anwendung noch Referenzen gibt, über die die Listen erreicht werden können, dann bleiben die erhalten.

Beispiele
Java:
private void meineMethode() {
List volleListe = ....;
}
Wenn die Methode fertig ist, kann die volleListe abgeräumt werden - es gibt keine Referenz mehr darauf.

Problematisch sind bzgl. Speicherlecks in Java so Dinge wie:
* static Referenzen
* Singletons (die sind ja quasi auch statisch)
* Caches, Lookup-Tabellen etc- alles wo man wiederverwendbar größere Datenmengen sammelt

Wenn du z.B. eine static Field von der Klasse X hast und die Klasse wiederum eine Membervariable der Klasse Y hat und die Klasse Y wiederum irgendwelche Member hat - dann werden die Inhalte da nie abgeräumt, da das statische Feld immer zugreifbar ist, dadurch ist dieses Objekt der Klasse X zugreifbar, dadurch ist das Objekt der Klasse Y was dadurch referenziert wird zugreifbar usw.
 

mihe7

Top Contributor
Nach X Deployments geht der Regelmässig mit einen OutOfMemoryError - OutOfMetaspace auf die Bretter.
Bah, das war beim Glassfish auch so - dort allerdings wegen PermGen. Das hat sich zwar mit Java 8 geändert, allerdings merkt man nach zig redeploys, wie das Teil immer langsamer wird. In Produktion ist das allerdings kein Problem mehr, da wir nicht mehr redeployen, Docker lässt grüßen :)
 

LimDul

Top Contributor
Hier im Projekt sind wir noch nicht produktiv - bei einem anderen Kunden wurde es da einfach so gelöst, das nach einen Deployment der ganze JBoss nochmal komplett durchgestartet wurde (aka "Vorschlaghammer drauf" und Ruhe).
 

OnDemand

Top Contributor
Huhu, hab jetzt gcverbose aktiviert. Dann logged es einiges. Man sieht aber, dass der RAM kontinuierlich steigt, lese ich das richtig raus?

Vielleicht wäre noch eine Info wichtig, mein Programm arbeitet in 50 eigenen Threads dinge ab (jeder Benutzer ein Thread) in der StartDatei habe ich -xmx5gb angegeben, heisst das jeder Prozess bekommt 5gb oder der service? wenn ich das runter nehme, komme ich auf memory allocation errors

1614244233320.png
 

mihe7

Top Contributor
Mein Verständnis dazu ist folgendes:

Xms -> Mindestgröße des Heaps
Xms -> Maximalgröße des Heaps

Der Prozess selbst braucht mehr, hier geht es nur um den Heap. Die JVM reserviert beim Start die Mindestgröße und dann nach Bedarf bis zur Maximalgröße für den Heap. Danach ist Schluss, ebenso wenn die Reservierung fehlschlägt. Letzteres kann man verhindern, wenn man Xms mit der gleichen Größe wie Xmx angibt, da dann beim Start gleich die maximale Größe reserviert wird.
 

mrBrown

Super-Moderator
Mitarbeiter
Die Zahl vor dem markierten müsste der „belegte“ Speicher seien, also das, was der GC nicht wegräumt. Das markierte ist nur der vorhandene Platz, der dabei aber zum Großteil leer ist.
 

LimDul

Top Contributor
Grundsätzlich gibt die JVM afaik einmal reservierten Speicher nicht mehr zurück, sprich dass der gesamte reservierte Speicher nur steigt ist ein normales Verhalten. Problematisch wird es erst, wenn der genutzte Speicher auch nur steigt.
 

httpdigest

Top Contributor
Grundsätzlich gibt die JVM afaik einmal reservierten Speicher nicht mehr zurück, sprich dass der gesamte reservierte Speicher nur steigt ist ein normales Verhalten.
 

mrBrown

Super-Moderator
Mitarbeiter
Grundsätzlich gibt die JVM afaik einmal reservierten Speicher nicht mehr zurück, sprich dass der gesamte reservierte Speicher nur steigt ist ein normales Verhalten. Problematisch wird es erst, wenn der genutzte Speicher auch nur steigt.
Mindestens die neueren GCs ab G1 machen das. Müsste man auch irgendwie explizit loggen können.
 

Thallius

Top Contributor
Man sollte übrigens genau deswegen beim Entwickeln und testen den erlaubten Speicher auf ein Minimum setzen um eben solche Fehler direkt zu finden und nicht erst wenn schon 50 Leute damit arbeiten.

BTW: Ich habe es bisher noch nie geschafft eine App zu schreiben die 5GB Speicher braucht und mit meinen Apps arbeiten Mitarbeiter aus ganz EMEA gleichzeitig.
 

OnDemand

Top Contributor
Ich habe jetzt das xms und xmx auf den selben Wert gesetzt, jetzt läuft es stabil. Auf dem Server laufen gut 4 Anwendungen welche zig gigabyte an Daten abholen und verarbeiten. Passt nun soweit :)
 

mrBrown

Super-Moderator
Mitarbeiter
Ich habe jetzt das xms und xmx auf den selben Wert gesetzt, jetzt läuft es stabil. Auf dem Server laufen gut 4 Anwendungen welche zig gigabyte an Daten abholen und verarbeiten. Passt nun soweit :)
Hast du denn vorher mal nach der Ursache gesucht? Nur Symptome zu behandeln ist nicht immer das sinnvollste, kann sein, dass der Fehler jetzt einfach nur drei Tage länger braucht, bis er auftritt

BTW: Ich habe es bisher noch nie geschafft eine App zu schreiben die 5GB Speicher braucht und mit meinen Apps arbeiten Mitarbeiter aus ganz EMEA gleichzeitig.
Dir ist schon bewusst, dass das kein wirkliches Achievement ist?
 

OnDemand

Top Contributor
Hab zur Zeit leider keine Zeit da mehr zu investierten. Die App wird demnächst abgelöst, von daher nicht so wild sollte sie nochmal abschmieren.

für die neue App hab ich mit Aber fest genommen den Speicher besser zu analysieren. Welches Tool ist dafür am besten geeignet? Jmetric oder wie es hieß? Nutze IntelliJ da gibts bestimmt auch gute Plugin
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
P Java 2n Potenzieren Java Basics - Anfänger-Themen 1
J Java Hamster Java Basics - Anfänger-Themen 4
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
laxla123 If-else Java Java Basics - Anfänger-Themen 4
RashAGhul Java Verwaltungstool Erstellen mit kaum Wissen Java Basics - Anfänger-Themen 9
S Substring in java Java Basics - Anfänger-Themen 3
Z Operatoren Java Applikation Java Basics - Anfänger-Themen 8
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2
sasnitzer java augensumme von zwei würfeln ist 1 Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben