www.mikrocontroller.net

Forum: PC-Programmierung loadClass-Problem bei Java-servlet. Resourcen-Problem?


Autor: Jürgen W. (lovos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bei meinem Servlet wird angehaengte Exception geworfen.

EDIT:
den Anhang kann nicht oeffnen, obwohl er eine Textdatei ist.
Die ersten Zeilen sind
30.11.2010 11:28:57 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load inet.htmlbas.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1273)
  at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
  at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
  at inet.httpthr.readhtml(httpthr.java:178)
  at inet.httpthr.transfer_http(httpthr.java:306)
  at inet.httpthr.get_http(httpthr.java:237)
  at inet.fileUpload3.doPost(fileUpload3.java:133)



Angeblich koennen Klassen nicht geladen werden, die aber definitiv im 
richtigen Verzeichnis vorhanden sind. Auch die File-Permissions stimmen.

Auf meinem lokalen Tomcat passiert das nicht, nur auf dem 
mivitec-Webserver
(Der lokale Tomcat benutzt exakt die gleichen Dateien, auch web.xml)
Nach langem Suchen konnte ich die das Problem durch einen Hack beheben:
Bei Beginn der doPost-Funktion allokier ich schon einmal ein 
htmlbas-Objekt und andere Klassen.
Wenn das schon am Anfang geladen wurde, dann kann er das auch an der 
kritischen Stelle laden.

Ich habe das Tomcat-Mini von
http://webhosting.mivitec.de/tomcat-provider/Jspse...
Bei diesem Paket ist TOMCAT - RAM (Arbeitsspeicher für Ihre 
Tomcat-Instanz) auf 64 MB beschraenkt.

Da dachte ich an Speicherplatzproblem.
An den kritischen Stellen gab ich Memory-Info aus:
Runtime runtime=Runtime.getRuntime();
long memtot = runtime.totalMemory();
long memfree= runtime.freeMemory();
out.println("memtot="+(memtot/1024)+
  "kiB ,memfree="+(memfree/1024)+"kiB<br/>\n");

memtot=64704kiB ,memfree=27627kiB
memtot=64704kiB ,memfree=27574kiB
memtot=64768kiB ,memfree=25407kiB

Daran sollte es nicht liegen. Meine paar Arrays sind nur maximal 0x4000 
lang.
Im Vergleich hat das gleiche Programm als Desktop-PC-Programm folgende 
ausgaben:
memtot=15552kiB, memfree=15276kiB
und da enstand nie eine classLoad Exception.

Weiss jemand, woher das obige Problem kommt? Der Workaround mit dem 
vorherigen Laden von spaeter benoetigten Klassen gefaellt mir nicht.

Gruss, Juergen

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> this web application instance has been stopped already ...
> and has no functional impact
Du versuchst da irgenwas außer der Reihe zu machen das Ihm (Tomcat) 
nicht gefällt...

Autor: Jürgen W. (lovos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du versuchst da irgenwas außer der Reihe zu machen das Ihm (Tomcat)
>nicht gefällt...

Hmm... was kann das sein? Normalerweise wird ja wegen jeder Kleinigkeit 
eine Exception geworfen, so dass man gezwungen wird in Java sauber zu 
programmieren.
Mein lokaler Tomcat jammert ja auch nicht.
Also schliesst du Ressourcen-Probleme aus?

Nachtrag:
Der Code umfasst mehrere 1000 Zeilen, so dass ich ihn nicht reinstelle. 
Da ist nichts besonderes drin, halt was man zum Parsen von html-Seiten 
braucht, z.B. vieles hin und her- kopieren von String[]-Arrays.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen G. schrieb:
>>Du versuchst da irgenwas außer der Reihe zu machen das Ihm (Tomcat)
>>nicht gefällt...
> Hmm... was kann das sein? Normalerweise wird ja wegen jeder Kleinigkeit
> eine Exception geworfen,
Nö, nur well ein fehlerhafter Zustand erreicht wird. Hier ein 
sogenannter "Ungültiger Zustand", d.h. in einem (Web)Modul wird versucht 
eine Klasse zu laden mittels eines Classloaders der zu einer Applikation 
gehört welche als beendet gekennzeichnet wurde... läuft da eventuell ein 
Thread im hintergrund weiter?

> Also schliesst du Ressourcen-Probleme aus?
Resourcenproblem wäre eine ClassNotFoundException, hier verweigert der 
Classloader generell den Dienst (in einem ServletContainer ist ein 
Classloader normalerweise nur für "seinen" Context zuständig um 
Fehler/Angriffe zu verhindern)

> Nachtrag:
> Der Code umfasst mehrere 1000 Zeilen, so dass ich ihn nicht reinstelle.
Sollange Teile auskommentieren bis der Fehler nicht mehr auftritt und so 
das Problem einkreisen oder debugger bemühen.

> Da ist nichts besonderes drin, halt was man zum Parsen von html-Seiten
> braucht
Parsen? Oder ausgeben? Für das ausgeben gibt es StringBuilder (oder man 
schreibt direkt in den ResponseWriter) und fürs Parsen bringt Java schon 
einen eingebauten HTMLParser mit wenn auch etwas versteckt...
> vieles hin und her- kopieren von String[]-Arrays
Hört sich verdächtig nach falschem Konzept an...

Autor: Jürgen W. (lovos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> vieles hin und her- kopieren von String[]-Arrays
>Hört sich verdächtig nach falschem Konzept an...

Darueber kann man unterschiedlicher Meinung sein.
Ich achte sehr auf einfache Strukturen, Uebersichtlichkeit.
Dieses Programm habe ich schon vor 6 Jahre angefangen als 
Desktop-Programm und dann staendig erweitert nach Erfordernissen. Jetzt 
wuerde ich schon einiges anders machen.

>> Da ist nichts besonderes drin, halt was man zum Parsen von html-Seiten
>> braucht
>Parsen? Oder ausgeben? Für das ausgeben gibt es StringBuilder (oder man
>schreibt direkt in den ResponseWriter) und fürs Parsen bringt Java schon

Html Parsen, Form-Felder ausfuellen, posten und kurze Status-Meldungen. 
(D.h. auf PrintWriter out = response.getWriter(); wird ganz wenig 
geschrieben.
Hoert sich einfach an, aber die Klassen sollen das fuer alle moeglichen 
Arten von Html-Seiten machen koennen.

>Sollange Teile auskommentieren bis der Fehler nicht mehr auftritt und so
>das Problem einkreisen oder debugger bemühen.
Genau das habe ich fuer meinen Workaroung gemacht.
Irgendwann hatte ich einen Schrumpf-Code, der funktioniert. Dann habe 
ich festgestellt, dass auch der Hauptcode laeuft, wenn vorher ein paar 
Klassen schon benutzt wurden (in dem Schrumpf-Code).
Durch logisches Denken waere ich nie darauf gekommen.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, du musst da irgendwie was Nebenläufiges drinne haben, oder 
eine andere Konfiguration des Classpath zwischen "Server"<-->"Zuhause"

Autor: Jürgen W. (lovos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, mir fehlen auch etwas Grundlagen. Java SE kenne ich zwar sehr gut, 
ein wenig Java ME, die Webprogrammierung mit PHP sehr gut, aber 
J2EE/JSP/Servlets ist total neu fuer mich.
Vielleicht kommt die Loesung, wenn ich tiefer einsteige; solange muss 
das Workaround taugen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.