• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

Java RAM Management

NicoDeluxe

NicoDeluxe

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.
 
W

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

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

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.
 
L

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

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
 
L

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)
 
NicoDeluxe

NicoDeluxe

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
 
L

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

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 :)
 
L

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).
 
NicoDeluxe

NicoDeluxe

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

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

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.
 
L

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.
 
H

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

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

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.
 
NicoDeluxe

NicoDeluxe

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

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?
 
NicoDeluxe

NicoDeluxe

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
Alan6 Java Editor BMI Rechner Java Basics - Anfänger-Themen 4
C java.sql Statement kann nicht geschlossen werden Java Basics - Anfänger-Themen 9
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
P myClass?.method() in Java Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
Marc111111111 Selection Sort in Java?? Java Basics - Anfänger-Themen 6
N Groß- und Kleinschreibung bei Java: void Methode Java Basics - Anfänger-Themen 1
T SelectionSort Java Java Basics - Anfänger-Themen 1
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
T Java Fx Java Basics - Anfänger-Themen 4
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
G Java Rabatt berechnen Java Basics - Anfänger-Themen 8
MPFeuer JAVA Expert-PDF Java Basics - Anfänger-Themen 1
M Java-Applet zur Mittelwertberechnung Java Basics - Anfänger-Themen 3
Abraham42 Berechnung der Kühlung Java Java Basics - Anfänger-Themen 12
J Java Queue mit default Werten erstellen Java Basics - Anfänger-Themen 4
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
S Allgemeine Java Codes lesen und verstehen Java Basics - Anfänger-Themen 7
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
TimoN11 Java spezielle Suchprobleme - Aufgabe Java Basics - Anfänger-Themen 5
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
H Brauche Hilfe in Java Eclipse Programmieraufgabe Neuling Java Basics - Anfänger-Themen 3
JaVaN0oB java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 17
Abraham42 Sparguthaben JAVA Java Basics - Anfänger-Themen 4
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
H Audio in Java Java Basics - Anfänger-Themen 3
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
R Java (Eclipse) "Lagerverwaltung" HILFE Java Basics - Anfänger-Themen 13
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Rekursive Java-Methode Java Basics - Anfänger-Themen 13
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
bafou Dreieckszahlen in java Java Basics - Anfänger-Themen 3
P Best Practice Druck aus Java Anwendung in MacOs Java Basics - Anfänger-Themen 0
G Java 2-dimensionalen int-Array Summe Java Basics - Anfänger-Themen 2
B java.time Duration mit Kommazahl? Java Basics - Anfänger-Themen 4
Devin Wo kann man einen Java Lehrplan finden? Java Basics - Anfänger-Themen 5
KogoroMori21 Java Datum Differenz (kleiner Fehler) Java Basics - Anfänger-Themen 10
O Java Weinachtsbaum in einem Bilderramen Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Gaudimagspam Dringend Java Hilfe benötigt Java Basics - Anfänger-Themen 19
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 1
Gaudimagspam BMI in Java implementieren Java Basics - Anfänger-Themen 38
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
F Fehlermeldung java.lang.NullPointerException Java Basics - Anfänger-Themen 4
S Sprung mit Java (GameGrid) Java Basics - Anfänger-Themen 9
Devin Wie lange braucht man um Java zu beherrschen und wie kann man es am schnellsten erlernen? Java Basics - Anfänger-Themen 7
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
T Klassendiagramm in Java überführen Java Basics - Anfänger-Themen 2
Gaudimagspam Caesars Code entziffern in Java Java Basics - Anfänger-Themen 8
V Gehalt berechnen in Java Java Basics - Anfänger-Themen 6
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
P Mit iPad Java lernen Java Basics - Anfänger-Themen 15
W Java in Exe Datei umgewandelt, Ressourcen fehlen (Bilder und Audiodateien) Java Basics - Anfänger-Themen 1
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
J Java FX - Label aktualisieren Java Basics - Anfänger-Themen 1
A Hilfe bei Java Projekt Java Basics - Anfänger-Themen 4
G Java Bruchrechner Addition, Multiplikation... Java Basics - Anfänger-Themen 12
M Java Einstellung von Apache POI für MS Word Erstellung mit Eclipse Java Basics - Anfänger-Themen 6
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
C Suche Nachhilfe in Java Java Basics - Anfänger-Themen 5
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
M Java entity und wertklassen Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
M Java Klasse Object Java Basics - Anfänger-Themen 5
M Java GUI label ändert sich erst zum Schluss Java Basics - Anfänger-Themen 4
G Java Lambda Ausdrücke Java Basics - Anfänger-Themen 19
M Java GUI explorer aufrufen um Pfad zu bekommen Java Basics - Anfänger-Themen 3
M Java Anweisungen Java Basics - Anfänger-Themen 4
M Java 8 Lambda Expression Java Basics - Anfänger-Themen 1
S Java Array Probleme Java Basics - Anfänger-Themen 3
Mr_Kleeblatt Operatoren if (arri[i] != "test.java"&& arri[i] != "test.class") Java Basics - Anfänger-Themen 3
S Java Stream API Java Basics - Anfänger-Themen 6
S Java Array Problem... Java Basics - Anfänger-Themen 2
M Java Listen Java Basics - Anfänger-Themen 4
G Java Object value und entity? Java Basics - Anfänger-Themen 2
X Kurzes Java-Programm, das sich komisch verhält Java Basics - Anfänger-Themen 6
_Zabuza_ Erste Schritte Wie am effektivsten Java lernen als Anfänger? Java Basics - Anfänger-Themen 12
G Java Dateisystem Java Basics - Anfänger-Themen 4
G Java charAt Methode Java Basics - Anfänger-Themen 10
L Java lernen Java Basics - Anfänger-Themen 1
G Rot-Schwarz-Bäume Java Java Basics - Anfänger-Themen 10
G Java LinkedList remove Methode Java Basics - Anfänger-Themen 5
G Java LinkedList Java Basics - Anfänger-Themen 6
G Java eingelesene Zahlen Java Basics - Anfänger-Themen 2
Y Java andere Klasse aufrufen Java Basics - Anfänger-Themen 6
I Java zweidimensionales array befüllen mit for-schleife Java Basics - Anfänger-Themen 2
Z vereinfachtes Wörterbuch in java modellieren Java Basics - Anfänger-Themen 10
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
S Geht das bei Java ? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Anzeige

Neue Themen


Oben