Überlastung des System durch JVM und Absturz verhindern oder besser vorbeugen?

flashray

Erfahrenes Mitglied
Hallo,

mir ist es einige male passiert, das ein Javaprogramm hängt, Windows dermaßen überlastet wird, das nicht einmal der Taskmanager sich öffnen lässt. So musste ich dann meinen PC resetten.

Was könnte man dagegen tun? Die Prozessorbelastung der JVM begrenzen? Speichernutzung begrenzen? Wenn diese überschritten werden sofort beenden? Oder irgendwas anderes?

Vg Erdal
 
Haloo,

Kann jemand vielleicht einfach nur sagen ob es so etwas gibt oder nicht? Einfach ein Ja oder Nein und vielleicht noch ganz großzügiger Weise ein Stichwort nach dem ich googlen kann!

Vg Erdal
 
hmmm drolliges Problem...
zunächst mal bekommst Du von mir ein entschiedenes JAIN :p

mal Spaß bei Seite...
ist das Programm von Dir? vermutlich hat es eine Endlosschleife. Also eigetnlich sollte man den Task-Manager schon öffnen können, nur Geduld ist vielleicht von Nöten.
Vielleicht ist in dem Programm ja ein Speicherleck, schau doch mal bevor es abstürzt in den TAskmanager und kontrolliere den benutzten Speicher unter welchen Umständern er anwächst und ob da irgendwann mal ein Stop ist oder er wieder zurück geht etc.
Du kannst mit den Java-Optionen zum Aufruf des Programms Speicher vorgeben, würde ich aber nur dann machen, wenn es mein eigenes Programm wäre, und geht glaube ich auch nur dann, wenn man an die Batch-Datei rankommt, von der es gestartet wird, so es eine Batchdatei bzw ein Zeilenkomando ist. (es gibt da halt auch möglichkeiten dies zu verschleiern, z.B. mit nativ-Code der die Anwendung startet. Bei Web-Start-Programmen wird dies über die JNLP-Datei, die auf dem Web-Server liegt geregelt.

Takidoso
 
Hallo Takidoso,

d.h. also man kann die Speichernutzung der JVM begrenzen. Beispiel das Programm soll höchstens 100 MB Ram nutzen dürfen. Ok das ist die eine Seite der Medaillie.

Kann man auch die Prozessorauslastung begrenzen? Wie die JVM darf den Prozessor höchstens zu 80 % auslasten.

Der aktuelle FirefoxBrowser erkennt zum Teil wenn auf geöffneten Seiten Skripte laufen die die CPU sehr belasten oder abgestürzt sind und frägt nach ob diese beendet werden sollen. Mir würde es schon reichen wenn die JVM oder meine Javaapplikation intern erkennt dass das System übermäßig belastet ist und dann sich einfach mit System.exit() beendet.

Das mit der Speicherbegrenzung müsste zu machen sein. Hat jemand einen Denkansatz für die Begrenzung der Prozessorauslastung und der Notroutine das sich das Programm oder die JVM bei übermäßiger Belastung sich selbst beendet?

Vg Erdal
 
Hallo,

hab das im Onlinebuch Java ist auch eine Insel gefunden.

-Xmxn Maximal verfügbarer Speicherbereich für die Allokation von Objekten. Voreingestellt sind 64 MB.

http://www.galileocomputing.de/open...sel26_001.htm#Rxx747java2600104000A021F02C118

Ist hier der insgesamt zur Verfügung gestellte Speicher begrenzt auf Xmxn oder was ist hier mit Allokation von Objekten gemeint. Die Voreinstellung für das Maximum sei nach dem obigen Auszug 64MB, meine Javaanwendungen nutzen auch gegebenenfalls mehr als dieses Maximum. Wie ist das zu verstehen?

Wie ich dem genannten Onlinebuch entnehmen konnte, hat der Javainterpreter keine Option für das CPUNutzmaximum!

Vg Erdal
 
Grüß Dich,
also leider hast Du immernoch nicht gesagt, wie Du das Java Program startest.
Ist es eine Batcht-Datei, oder eine native Anwendung, die es startet, oder ist es Web-Start?
 
ahhh, gut, dann hast Du die C hane den eigentlichen Fehler der Anwendung zu analyseiren und zu beheben.
Wenn Deine Anwendung unerklärlich die ganze CPU-Zeit fressen sollte ohne aufzuhören, dann hast Du ganz offensichtlich eine Endlos-Schleife drinne.

starte mal Task-Manager und dann erst Deine Anwendung und versuche die Situation zu identifizieren, wann Dein Programm zu einem CPU-Fresser wird.
Falls Du irgendetwas rekursiv gebaut hast und Deine Abbruchbestimmung nicht stimmen sollte dann würde irgendwann Dein Programm mit einem Stack-overflow reagieren. da dies nicht der Fall ist spricht vieles dafür dass es eine iterative algorithmik nicht stimmt und endlos wird.
Ein typischer Fall wäre es, wenn Du in Deiner Abbruchbedingung etwas hast, welches sich nicht verändert um die Abbruchbedinung zu erreichen, meist ein Schreibfehler der nicht selten durch ein Copy-Paste verursacht sein kann.

naja wie gesag, gehe mal Deine Algorithmen durch und hinterfrage sie auf Schreibfehler

viel Glück

Takidoso
 
Hallo Takidoso,

Es geht mir darum, eine paar Standartmethoden in meine Mainklasse einzubauen, die das JVM beobachten und bei einer eventuellen Überlastung des Systems die JVM sofort beenden, so dass ein Neustart oder Resetten des PCs vermieden werden kann.

Beispiel. Ich habe einen Txt-Editor (Qalem Notepad) geschrieben. Ich wollte den Speicherverbrauch und die Reaktionsgeschwindigkeit meiner Applikation und mit denen des Microsoft Notepads vergleichen. Ich habe meinen Taskmanager aufgemacht und bei beiden jeweils die gleiche Textdatei geladen. Und für verschieden große Textdateien auspobiert. Schließlich habe ich mit beiden eine ca. 4MB große Textdatei geladen. Für den MS Notepad war dies kein Problem. Mein Editor hat die Datei zwar geöffnet, war aber ziemlich träge. Der genutzte Speicher lag bei 80MB laut Taskmanager. Habe in meinem Editor den Text bearbeitet um die Reaktionsgeschwindigkeit festzustellen. Dann ist mein Editor hängengeblieben, das ich nicht mal neustarten konnte. Habe den PC dann mit dem Powerbutton beenden müssen.

D.h. unabhängig von dem eigentlichen Programmcode, ob dieser Fehler, oder unendliche Schleifen enthält oder nicht, wäre es meines Erachtens gut, dass das Programm permanent das System überwacht und sich selber bei Bedarf beendet.


Habe durch Stöbern in der Java Insel das "JMX" entdeckt.
http://www.galileocomputing.de/openbook/javainsel5/javainsel23_001.htm#Xxx999378

Ich glaube damit müsste man die Speicherverbrauch der JVM beobachten können. Und dann einfach nur System.exit() wenn die Alarmglocken leuten.

Allerdings bietet die JMX-API soweit ich das bisher untersucht habe keine Möglichkeit die Prozessornutzung der JVM festzustellen. Da müsste man irgendwie an die Werte des Windows Service für die gegebene JVM kommen?

Fazit: Speicherkontrolle müsste über JMX zu machen sein. Für die CPUkontrolle wäre ein Ansatz über die Windows Services. Wie man mit Java darauf zugreifen könnte, weiss ich jetzt nicht?



Vg Erdal
 
Also ich denke das man das nicht in einer Anwendung machen sollte, die JVM runterzufahren, bzw die Anwendung runterzufahren, wenn sie irgend etwas technisches bemerkt.
Für einen besseren Ansatz hielte ich es so etwas außerhalb der JVM anzusiedeln, dass wenn der, ich nenne mal Monitoring-Prozess, eine zu Hohe Last feststellt die JVM beendet. Denn Klar ist, wenn Du sowas in eine Anwendung schreibst hättest Du Deine Anwendung BS-spezifisch. Also nicht so dolle, wenn man Java verwenden möchte, wegen seiner Portierbarkeit (andere Gründe Java zu verwenden kenne ich ehrlich gesagt nicht).
Normalerweise ist es so, dass Windows (zumidnest XP) feststell nach einiger Zeit, wenn ein Prozess sich nicht mehr zurückmeldet und kommt mit einer entsprechendne Meldung, so fern das Betriebssystem nicht zu arg ausgelastet ist. In anderen Worten Du müstest eigetnlich diese Funktionalität als eine Betriebssystemfunktion ansehen, und wenn das BS was Du verwendest es nicht tut, oder nur unzurechend, dann musst Du versuchen um diese Funktion zu erweitern oder zu verbessern. Denn eines ist ja klar, wenn der JVM Process nicht mehr weiter kommt, kommt vermutlich Deine in Java gestrickte Abfrage auch nicht weiter, selbst by Multithreadying nicht, es sei denn Du hast eine Multiprozessor-maschiene, so würde ich mal denken.
Naja also muss offenbar für Dich ein native-Programm her, welches darüber wacht.
Das wäre zumindest mein strategischer Gedanke.

in diesem Sinne

Takidoso
 
Zurück