Schweres Problem: Programm "hängt" alle 2 Sekunden für ca. 1 Sekunde, wie herangehen?

DarthShader

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem mit meinem Programm:

Es handelt sich dabei um eine Anwendung, die eine Swing Oberfläche hat. Sie ist mittlerweile recht umfangreich. Manchmal (und diese zeitliche Eingrenzung kann ich leider nicht besser angeben) stockt das gesamte Programm in eine Intervall von ca. 2 Sekunden immer für ca. 1 Sekunde.

Das "fühlt" sich so an, als würde das gesamte Programm einfach ganz kurz "hängen" bzw. "nicht mehr reagieren", und das ca. alle 2 Sekunden. Man kann dies gut an der Verzögerund der Oberfläche erkennen. Interessant dabei ist (mögilcherweise ist dies eine wichtige Information), dass die Eingaben, z.B. ein Klick, nicht verschluckt werden wenn das Programm hängt, der Klick wird dann einfach ca. 1 Sekunde später ausgeführt.

Das Programm benutzt keine Threads (natürlich ein Main Thread, einen EDT), die da irgendwas blockieren könnten. Und selbst wenn, würden die ja nicht das gesamte Programm, vor allem die Oberfläche, anhalten. Möglicherweise stoppt auch der EDT immer kurz, das kann ich nicht genau sagen.

Manchmal denke ich auch, es liegt am Garbage Collector, als würde der genau alle 2 Sekunden versuchen, den Speicher aufzuräumen.

Meine Frage(n) wäre nun, wie geht man nur an solch einen Fehler heran? Wo kann ich anfangen zu suchen? Gibt es Tools, die mir bei sowas helfen könnten, würde ein Profiler hier helfen?

Hat jemand vielleicht eine Idee, woran das allgemein liegen kann, gibt es bekannte "Stolpersteine" die solch einen Effekt auslösen könnten?


Ich bin Euch für jeden Tipp und jede Info dankbar


Vielen Dank für Eure Hilfe!
 
Hi,

so wirklich genau kann ich dir natürlich auch nicht sagen, woran das ganze liegen könnte. Tritt denn das Problem bei anderen Rechnern auf, bzw. bist du dir sicher, dass der Fehler an dem Programm liegt?

Generell lassen sich solche Fehler idR. Recht schnell finden, denn schließlich muss der Fehler ja irgendwann mal das erste Mal aufgetreten sein. Man hat da also etwas am Quelltext gemacht und seit dem tritt dieser Fehler auf. Also geht man eben an diese Stelle und debugt die. Wenn man jedoch diese Stelle nicht kennt, wird es recht schwer. Dann braucht man Tools, die einem die Arbeit abnehmen, sogenannte Profiler. Ich verwende gerade den JProfiler (kostenpflichtig), vorher hatte ich aber immer JMeasurement im Einsatz. Damit sollte sich der Fehler finden lassen.

Schönen Gruß und eine gute Nacht!
 
Hallo,

das richt ziemlich stark nach einem Problem das durch den GC verursacht wird.
Schau doch mal mit der JConsole drauf (GC Zyklen Anzahl und dauer der Collections analysieren). Starte deine Anwendung mal mit: -XX:-PrintGCDetails damit bekommst du detaillierte Informationen zu GC Vorgängen.
Weiterhin könnte es sich bei dir auch um ein painting / repainting Problem handeln. Dazu muss man jedoch etwas mehr über deine Anwendung wissen...
Wann kommt es zum slow-down? In einem bestimmten Modul, einer bestimmten Ansicht, wenn eine bestimmte Aktion gemacht wurde?

Gruß Tom
 
Erstmal vielen Dank für Eure Antworten!

Tritt denn das Problem bei anderen Rechnern auf, bzw. bist du dir sicher, dass der Fehler an dem Programm liegt?

Ich denke es ist hilfreich, wenn ich mal eben erzähle, wie ich den Fehler zum ersten mal entdeckt habe:

Auf meine Entwicklungsrechner trat es lange Zeit nicht auf. Dann habe ich das Programm auf einem anderen Rechner (ein Notebook) ausgeführt, und dort habe ich das "Stoppen" zum ersten Mal gesehen. Zunächst dachte ich, es läge am Rechner. Später dann habe ich das Problem plötzlich auch auf meinem Entwicklungsrechner sehen können. Zwar nicht so häufig, aber es trat auf.

Generell lassen sich solche Fehler idR. Recht schnell finden, denn schließlich muss der Fehler ja irgendwann mal das erste Mal aufgetreten sein. Man hat da also etwas am Quelltext gemacht und seit dem tritt dieser Fehler auf. Also geht man eben an diese Stelle und debugt die.

Ich kenne die Stelle aber nicht, und das ist ja das Problem. Ich habe nicht einmal einen Hauch eines Ansatzes, wo der Fehler liegen könnte oder seit wann ich den Fehler habe und den damit verbundenen Quelltext.

Wenn man jedoch diese Stelle nicht kennt, wird es recht schwer. Dann braucht man Tools, die einem die Arbeit abnehmen, sogenannte Profiler. Ich verwende gerade den JProfiler (kostenpflichtig), vorher hatte ich aber immer JMeasurement im Einsatz. Damit sollte sich der Fehler finden lassen.

Ich hoffe, solch ein Profiler kann mir da helfen. Ich hatte JProfiler schonmal benutzt, hatte aber irgendwie meine Schwierigkeiten, wirklich gute Informationen daraus zu ziehen. Das Ding ist auch, dass bei solch eine "Hänger" die CPU Auslastung nicht steigt, es gibt also keine kurzzeitige CPU-Spitze (aber vielleicht ist dafür der Win Task Manager auch einfach ungeeignet).



das richt ziemlich stark nach einem Problem das durch den GC verursacht wird.

Ja, genau das Gefühl habe ich auch.

Schau doch mal mit der JConsole drauf (GC Zyklen Anzahl und dauer der Collections analysieren). Starte deine Anwendung mal mit: -XX:-PrintGCDetails damit bekommst du detaillierte Informationen zu GC Vorgängen.

Gut, diese Tipps benötige ich auch, denn das habe ich noch nie gemacht. Ich werde mich also erstmal informatieren über die JConsole, und wie ich die GC Zyklen und "Dauer der Collections" analysieren kann. Ich würde mich freuen, wenn ich dazu, käme ich nicht weiter, hier nochmal nachfragen kann.

Weiterhin könnte es sich bei dir auch um ein painting / repainting Problem handeln. Dazu muss man jedoch etwas mehr über deine Anwendung wissen...
Wann kommt es zum slow-down? In einem bestimmten Modul, einer bestimmten Ansicht, wenn eine bestimmte Aktion gemacht wurde?

Das ist eines der Probleme, ich kann mit diesen Informationen einfach nicht dienen. Es sieht völlig nicht deterministisch aus (íst es sicherlich nicht). Ich weiß nur, dass es auf allen Views auftritt. Dazu ist noch zu sagen, dass die gesamte Applikation keine "normale" Windows Anwendung ist, sondern auf einem Industrienotebook als quasi Embedded System läuft. Dadurch besitzt es eine völlig individuelle GUI mit selbst gezeichneten Komponenten (alles Swing). Ich schließe ein solches Painting/Repainting Problem deshalb keineswegs aus. Aber wie kann man in der Beziehung dann am besten da ran gehen?
 
nutz doch einfach mal die JConsole. Da kannst du auch auf "run Garbage Collector" klicken. Da siehste ja was passiert wenn der GC zuschlägt. Außerdem hast du da eine schöne Grafische Ausgabe des Speicherverbrauchs.

Vielleicht hast du auch irgendwo ein Leak

Chriz
 
Ja das werde ich auch sofort machen, sobald das Problem wieder auftritt. Sollte es die nächsten Tage nicht auftreten, dann werde ich mal das JDK auf dem anderen Rechner installieren ,auf dem es sehr oft auftrat und dort mit der JConsole arbeiten.
 
Zurück