MemoryLeak nicht zu finden

OnDemand

Top Contributor
Moin, hab ein MemoryLeak in meiner Spring Boot App, irgendwo in einer Klasse, finde es aber nicht.

Habe mir remote mit jmap -dump:format=b,file=/opt/tmp/heapdump.bin 37320 einen dump erstellt und in VisualVM geöffnet. Ich sehe da, dass ein byte array ausser Rand und Band läuft und das wohl die Stelle ist welche es zu erforschen gilt.

Nur habe ich keinen blassen Schimmer wo ich anfangen soll, da mit keinerlei Klasse oder so in Visual ausgegeben wird:

1660367454704.png
und als references steht nix besonders

1660367486008.png

Ich habe die Vermutung, dass eine Klasse immer und immer wieder benutzt wird, obwohl sie jedes Mal neu erstellt werden soll.
Ich habe einen Quartz Job welches jede 15 Minuten aufgerufen wird.

Der Quartzjob ist mit @Service annotiert, Der Quartzjob ist mit @DisallowConcurrentExecution annotiert, nicht aber mit @Service kann es sein, dass jedesmal das selbe Jobobject benutzt wird und darin eine Liste irgendwo stetig wächst? Eigentlich mache ich auf alle Maps und Lists .clear() wenn ich sie nicht mehr brauche, eben um RAM zu sparen. Aber irgendwie klappt das nicht.

Hat jemand ne Idee wie ich dem Leak auf die Spur kommen kann?
 

httpdigest

Top Contributor
Solange du nicht wirklich einen OutOfMemoryError bekommst, würde ich mir keine Sorgen machen.
Die kombinierte Anzahl an Speicher für diese byte Arrays liegt ja gerade mal bei nur 0,6 Prozent mit seinen ~23 MB.
Das heißt, dein gesamter Prozess verwendet ~4GB Speicher.
Wenn die JVM so viel zur Verfügung hat, dann nutzt sie das auch und gibt nicht unbedingt immer etwas ans Betriebssystem frei.
 

OnDemand

Top Contributor
Moin, danke für Deine Antwort. Nach einiger Zeit ist die App down und im sys.log steht drin, dass der Prozess gekilled wurde.

Habe das jetzt mal lokal angesehen, da fällt der ApplicationContect auf der recht groß ist, darin irgendwelche statsjson von Vaadin die sich aufsummieren mit der Zeit
1660372562072.png
 

LimDul

Top Contributor
Anhand der Informationen bin ich noch nicht von einem Speicherleck überzeugt. Der ApplicationContext ist das zentrale Singleton der Anwendung, klar ist der groß. Und das der Vaadin Krams drin hat, bei dem Zeug, was mit NPM Packages und Co macht, mag ok sein. Und 22 MB für ein Singelton sind Peanuts, bei einer Anwendung die Mindestens 1 GB, eher mehr zur Verfügung haben sollte.

Solche Probleme weiß ich leidgeprüft, sind extrem hässlich zu analysieren. Daher mal ein paar Tipps/Fragen:

  • Wer killt den Prozess warum?
  • Was steht im Log der Anwendung zu dem Zeitpunkt?
  • Wie ist der Speicher-Verbrauch der Anwendung über die Zeit?
  • Wie sind die Xmx und Co-Parameter?
  • Wie viel Speicher steht auf der Maschine zur Verfügung?

Sollte das noch passiert sein, wäre es jetzt dringend notwendig ein Monitoring der Anwendung aufsetzen, dass zentrale Performance-Parameter loggt. Stichwörter dazu microprofile metrics und dann wegschreiben in eine DB (Standard Tools in dem Umfeld sind wohl telegraph, influxdb, grafana und co)

Edit: https://spring.io/blog/2018/03/16/micrometer-spring-boot-2-s-new-application-metrics-collector - hier steht was zum Monitoring von Spring Boot, was schon out of the box eingebaut ist.

Das A und O bei sowas ist:
  • Informationen (und zwar im zeitlichen Ablauf, nicht wie hier reine Snapshots)
  • Jemanden der versteht, wie man die auswertet
 

OnDemand

Top Contributor
Hallo Limdul, danke für deine Hilfe. Hier mal ein paar Antworten auf Deine Fragen. Wir haben grad noch @PWA entfernt, das hat den AppContect um 70% verkleinert. Mit dem PWA sind auch ein paar Ladeprobleme verschwunden, wir hoffen dass das auch mit dem RAM nun gelöst ist.

  • Wer killt den Prozess warum?
    Das OS killt den Prozess mit dem Hinweis "Memory Out" killed proces 1234 (exakte Fehlermeldung kann ich später noch mal hier einstellen, wenn es wieder auftaucht)

  • Was steht im Log der Anwendung zu dem Zeitpunkt?
    Leider nichts, ist einfach offline. Keine OutOfMemoryException o.ä.

  • Wie ist der Speicher-Verbrauch der Anwendung über die Zeit?
    Wächst kontinuierlich an, ohne RAM freizugeben

  • Wie sind die Xmx und Co-Parameter?
    die App startet über ein Linux .service mit folgenden Parametern
    ExecStart=/bin/sh -c "java -jar -Dserver.port=8080 -Djasypt.encryptor.password='xxx' -Dspring.profiles.active=live -Xms4g -Xmx4g /var/xxxx/app/app.jar >> /var/xxxx/app/app.log"

    haben aber auch schon xms=1G und xmx=4G getestet

  • Wie viel Speicher steht auf der Maschine zur Verfügung?
    5GB
 

thecain

Top Contributor
Hast du die Applikation schon mal mit -XX:+HeapDumpOnOutOfMemoryError gestartet? Das könnte bei der ersten Analyse mehr helfen, als ein Heapdump irgendwann während der Laufzeit
 

KonradN

Super-Moderator
Mitarbeiter
Evtl. liege ich falsch, aber für mich hört sich das etwas nach einem System Problem an und nicht nach einem Java Problem. Wie ist die Speicherauslastung des gesamten Systems? Wenn das Java Programm von außen gekillt wird, dann wird es gekillt. Da wird auch eine Analyse nichts bringen fürchte ich.

Das Porgramm hat halt einen relativ hohen Speicherverbrauch (4GB) und ist damit immer ein Kandidat für den "Linux Out Of Memory Killer", den das System einsetzt, wenn es einen kritischen Speicherstand hat.
 

OnDemand

Top Contributor
Das gesamte System ist zu 75% ausgelastet. Aufgrund der fehlenden OutOfMemory Exception sieht mir das auch so aus als wäre das OS überlastet. Das so gar nix im Log der Anwendung steht ist seltsam
 

KonradN

Super-Moderator
Mitarbeiter
Wenn das System von außen den Prozess killt, dann kann da nichts stehen. Wenn man Dir einen Kopfschuss verpasst, wirst Du Dich nicht auch noch verabschieden und allen Bescheid sagen: Sorry, ich bin dann jetzt mal weg, da ich einen Schuss in den Kopf bekommen habe.

OutOfMemory Exception ist ja auch nur dann, wenn etwas in der JavaVM mehr Speicher haben will und dieser nicht zur Verfügung steht.

Evtl. hilft Dir ja dies hier:
 

LimDul

Top Contributor
Ehm,. wo ich da mysqld sehe. Da läuft nicht ernsthaft noch ein Mysql-Server auf der Maschine? Das die dann abraucht ist ja kein Wunder.

5 GB Ram - davon der Java VM 4 GB erlaubt, bleibt noch 1 GB Ram für den gesamten Rest (bzw. eher weniger, weil afaik nutzt die JVM insgesamt mehr Speicher). Das heißt 1 GB für OS + Mysql + was auch sonst noch läuft ist extrem wenig. Gerade Datenbanken (sofern man mysql als solche bezeichnen will), sind extrem speicherhungrig.
 

OnDemand

Top Contributor
Ja Mysql läuft da auch (später migrieren wir vermutlich zu Postgres, aktuell aber zu viel Aufwand). Es läuft bisher tadellos auf anderen Kisten. Nur die eine Instanz macht grad ein paar Problemchen.

Jetzt ohne die PWA Annotation bleibt der RAM bei stehen und wächst nicht mehr ins unendliche, sehr seltsam. soll es am PWA gelegen haben können?
 

KonradN

Super-Moderator
Mitarbeiter
hast du denn mal versucht , java weniger Speicher zu geben? wenn Du nur 5GB hast und du auch noch die Datenbank brauchst und so, dann macht da so nicht wirklich Sinn. Mal geschaut, ob der Server ggf mit 2GB klar kommen würde?

Ansonsten hilft da nur, dem System mehr Speicher zu geben.
 

LimDul

Top Contributor
Das Problem ist nicht deine Java-Anwendung, sondern der zur Verfügung stehende Speicher. Wenn du der Java VM 4 GB gibst, kann sein dass deine Java-Anwendung 3,8 GB Speicher reserviert, von diesen 3,8 GB aber bereits 2 GB durch den Garbage Collector abgeräumt werden könnten. Aber da die Java VM 4 GB nutzen darf, muss sie das nicht tun. Und dann geht dem OS der Speicher aus, weil das OS sieht ja nur die 3,8 GB die die Java gerade aktiv in Beschlag nimmt.

Das was du der Java VM als Höchstgrenze zugestehst, das musst du für das OS so kalkulieren, als würde das immer zu 100% ausgenutzt von der Java VM.
 

KonradN

Super-Moderator
Mitarbeiter
xmx gibt den maximalen Heap Speicher an. Mit -xmx2G weist Du java an, nicht mehr als 2GB Heap Speicher zu belegen. (Ein "von" gibt es dabei nicht. Das ist dann egal.)
 

LimDul

Top Contributor
Deine Maschine hat doch 5 GB sagtest du und die Parameter die du oben hattest, waren mit Xmx=4GB

Wenn du Xmx auf 2 Gigabyte setzt nutzt die VM nur 2 - aber nicht von 4 sondern von den 5
 

LimDul

Top Contributor
Noch mehr Lektüre, da ich mal davon ausgehe, dass bei 5 GB Ram es sich um einen Container handelt:

always make sure you allocate at least 25% more memory to your container (i.e. ‘-m’) than your heap size value
Da bist nur 4 GB Heap vs. 5 GB Ram exakt an der Grenze gewesen
 

OnDemand

Top Contributor
Container ist es nicht direkt, also kein docker o.ä. ist ne VM (ist ja auch ne Art Container :p)

Wir haben als Maßstab immer genommen: VM hat 4GB RAM, wir geben dem Heap 3GB also immer 1GB fürs OS. Reicht wohl nicht 🫡
 

OnDemand

Top Contributor
Wie verhält es sich mit dem Input? Wir lesen da Dateien > 300MB via BufferedReader. Das geht doch auch auf den RAM oder drosselt die JVM die Lesegeschwindigkeit entsprechend dem verfügbaren RAM?
 

KonradN

Super-Moderator
Mitarbeiter
Wie verhält es sich mit dem Input? Wir lesen da Dateien > 300MB via BufferedReader. Das geht doch auch auf den RAM oder drosselt die JVM die Lesegeschwindigkeit entsprechend dem verfügbaren RAM?
So Du die Datei nicht als Ganzes in den Speicher lädst, ist das vollkommen egal. Die Frage ist halt, was Du da machst.
 

OnDemand

Top Contributor
Ich lese die Daten Zeile für Zeile ein, jede Zeile wird in ein Objekt gewandelt und dann wird damit weiter gearbeitet (Das Einlesen macht ein Framework - UnivocityParser)
 

KonradN

Super-Moderator
Mitarbeiter
Also wenn Du dann die Objekte alle im Speicher hältst, dann wirst Du da natürlich entsprechend Speicher brauchen. Du kannst ja grob überschlagen, wieviel Speicher ein Objekt braucht um das dann mit der Anzahl zu multiplizieren. Das ist in der Regel ein vielfaches der Datei.

Aber wenn Du die Objekte nur erzeugst, etwas damit machst um sie dann "zu vergessen" und zur nächsten Zeile zu gehen, dann hast Du keinen dauerhaft belegten Speicher.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
izoards log4j2 will nicht.... Allgemeine Java-Themen 15
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
I serialVersionUID - explizit vergeben oder nicht? Allgemeine Java-Themen 6
MiMa Vorhandenes das nicht existiert?? Allgemeine Java-Themen 7
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
D Twitch API mit HttpURLConnection läuft nicht? Allgemeine Java-Themen 0
M Test geht auf Travis und mit Github Action schief aber nicht lokal Allgemeine Java-Themen 3
R Threads Clip loop loopt nicht Allgemeine Java-Themen 2
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand JMS Messages nicht abgeholt Allgemeine Java-Themen 0
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
W Javac nicht bei Installation installiert Allgemeine Java-Themen 9
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Java.exe exestiert, aber irgendwie auch nicht Allgemeine Java-Themen 11
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
X JNA funktioniert nicht mehr Allgemeine Java-Themen 4
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
Drachenbauer Division mit Int funktioniert nicht Allgemeine Java-Themen 3
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
I Vererbung Nicht erklärliche NullPointerException Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben