kopf.lastig | Alles mögliche zu Themen wie Familie, Beruf, Medien etc. …

CAT | Software-Entwicklung

Problem

While using Oracle Enterprise Pack for Eclipse (Version 11.1.1.7.1) with Weblogic 11gR1 (that is 10.3.4.0) for some weeks
I suddenly was not able to stop the Weblogic server. Whatever method I used to stop the server, it didn’t work. When I restarted Eclipse
the Weblogic server started automatically again. Also, there were no more console output neither from the server nor from my application.

Solution

I manually started the “bin\stopWeblogic.cmd” skript in the domain home directory using the Windows console. You can go to the
domain home by right-clicking the server in the “Servers” view and choosing “Go To > Domain Home”. When I started the server
again from within Eclipse, the console output was there again and stopping the server worked well again. All is well :-)

No tags

Glenn Vanderburg hielt auf der “Lone Star Ruby Conference 2010” einen interessanten Vortrag mit dem Titel “Real Software Engineering”. Er bezeichnete dabei heutiges “Software Engineering” (dt.  “Software-Technik“) als Karikatur einer Ingenieursdisziplin  und versuchte, über “Real Engineering” (also traditionelles Ingenieurswesen) zum “Real Software Engineering” zu gelangen.

Inhalt

Zunächst unternahm Vanderburg ein kurzen Ausflug in die Geschichte der Software-Technik:

  • die erste Konferenz zum Thema,
  • dem in seiner Auswirkung desaströsen Paper zum Wasserfallmodell – als Negativbeispiel für Informationsdarstellung -,
  • dem nachfolgenden Versuch, ein definiertes Prozess-Steuerungsmodell zu definieren
  • der Annahme, das Ingenieure als Arbeitsergebnisse Dokumente haben (daher dokumentenlastige Vorgehensmodelle)

In anderen Ingenieursdisziplinen gehe der Fortschritt meist von Praktikern aus. (Mathematische) Modelle würden als Kosteneinsparung genutzt, um weniger physische Modelle zu bauen. Die physischen Modelle werden genutzt, um die mathematischen Modelle zu überprüfen.

In der Software-Technik würden Modelle (im Sinne von physisch) und Tests wenig kosten, daher könne man sich die Nutzung von mathematischen Modellen (à  la UML etc.) im Vergleich zu anderen Ingenieursdisziplinen verringern. Mehr noch, Code sei letztlich das Modell und Compiler/Linker/etc. seien in der Analogie zur Baustelle die Arbeiter. Dies sei heute um eher einsehbar, da heute Code mehr denn je so einfach zu lesen wie zu schreiben ist.

Schließlich stellte Vanderburg agile Vorgehensweisen als “empirisches Prozess-Steuerungsmodell” vor. Derartige Modelle würden auch in anderen Ingenieursdisplinen genutzt.

In Anlehnung einer Definition für das Bauingenieurswesen schlägt er folgende Definition für Software-Technik vor:

… ist die Wissenschaft und Kunst, System ökonomisch und elegant so zu entwerfen und zu erstellen, dass sie sich leicht den Situationen anpassen, denen sie ausgesetzt sind.

Hier kämen die Spannungsfelder Wissenschaft (Mathematik) – Kunst – Ökonomie gut zum Ausdruck.

Highlights

Toll fand ich die Darstellung, wie das Waterfall-Paper missverstanden werden konnte.

Interessant auch die Feststellung, dass die der Fehlerkostenkurve von Boehm zugrundeliegende Projekte nach dem Wasserfall-Modell waren und die Kurve daher in Wahrheit die Kosten von großen Rückkoppelungsschleifen darstellt.

No tags

Sep/09

25

Einfache Konstruktoren

Gespräch mit Kollege:
Gegeben Klasse A und Klasse B extends A und ich rufe im Konstruktor von A eine Methode auf, die in B überschrieben wird und die dort auf eine in B definierte Variable zugreift, dann ist diese Variable zum Zeitpunkt des Aufrufs nicht initialisiert. Das stimmt.

Wozu brauchst Du das?
Klasse Gruppenbaum, im Konstruktor lese ich Baum aus DB.
Na das ist ja nicht so gut. Konstruktoren sollten ihr Objekt in einen definierten Zustand bringen, mehr aber auch nicht. Wurde schon vor langer Zeit beschrieben.

·

Letztens haben wir nach Hardware- und JDBC-Treiber-Wechsel folgende Fehlermeldung bekommen:

ORA-01000: too many open cursors (oder auf deutsch: maximale anzahl offener cursor überschritten)

Tatsächlich gab es noch 2 Statements im Application-Server, bei das Statement nicht geschlossen wurde. Man findet die betreffenden Statements mit folgendem SQL:

SQL:
  1.  
  2. SELECT
  3.         c.sid,
  4.         c.address,
  5.         c.hash_value,
  6.         COUNT(*)       AS "Cursor Copies"
  7. FROM    v$open_cursor c
  8. GROUP BY
  9.         c.sid,
  10.         c.address,
  11.         c.hash_value
  12. HAVING
  13.         count(*) > 2
  14. ORDER BY
  15.         3 DESC
  16.  

Unter Umständen kann man im Live-System beobachten, wie die Anzahl der offenen Cursor wächst.

Offensichtlich hat uns der vorherige JDBC-Treiber das nicht-Schliessen des Statements vergeben.

·

Sep/08

19

Finalizer in Java: lieber Finger weg!

Laut Java-Spezifikation werden Finalizer in Java aufgerufen, bevor das entsprechende Objekt durch den Garbage Collector aus dem Speicher entfernt wird. Das klingt erst mal verlockend - hier könnte man ja automatische das Freigeben von Resourcen unterbringen.

Aber! Es wird nicht garantiert, wann der Finalizer aufgerufen wird. Die freizugebenden Resourcen sind solange blockiert. Schlimmer kommt es noch, wenn ein Finalizer ungewöhnlich lange für die Verarbeitung benötigt. Dann können die Resourcen, die die Objekte der anderen anstehenden Finalizer halten, nicht freigegeben werden. Dies kann zu Out-of-Filehandles oder zu Out-of-Memory-Fehlern führen, wenn die Entwickler sich auf die zeitnahe Abarbeitung von Finalizern verlassen.

Dies ist uns letztens passiert: Unsere Anwendung beendet sich nachweisbar nach einigen hundert Webservice-Aufrufen. Ergebnis der Problemanalyse: Ein Objekt einer Klasse des Oracle IAS scheint den Finalizer-Warteschlange zu blockieren, somit werden Objekte aus dem AXIS-(1.0)-Framework nicht finalisiert, die jedoch Referenzen auf speicherfressende DOM-Objektbäume halten. Diese DOM-Objektbäume können dadurch nicht garbage-collected werden, sammeln sich an und schliesslich kommt der Out-of-Memory-Fehler. Im generierten Webservice-Stub-Code haben wir manuell den Aufruf an den Finalizer (genauer: an die dispose-Methode) eingefügt und siehe da, dass Problem ist beseitigt.

An einer anderen Stelle (ebenfalls AXIS) sind wir vor 1-2 Jahren in ein ähnliches Problem gelaufen, da ging es jedoch um FileHandles oder Netzwerk-Ports. Auch da half manuelles freigeben der Resourcen.

Fazit: Es ist besser, die Resourcen von Hand freizugeben. "Zur Sicherheit" mag man noch einen Finalizer schreiben, aber wenn dieser wiederum die Finalize-Warteschlange blockieren könnte (etwa weil auf ein Netzwerk-Timeout gewartet wird), dann sollte man auch davon die Finger lassen.

Tools zum Analysieren von Memory-Dumps:

·

Wir hatten folgendes Problem.

Symptom: Manchmal wurden Bilder nicht geladen, Manchmal gab es Fehlermeldungen am Anfang oder Ende einer Seite.

Umgebung: J2EE-Anwendung auf Oracle IAS 9.0.4 (2 OC4J-instanzen) unter Sun Java VM 1.4.2 auf HP-UX, 8 Prozessor-Maschine, als Entwicklungsumgebung.

Analyse:

  1. vmstat sagt: ca. 35-40 Prozesse laufen ständig, Anteil user 15%, Anteil sys 85%, idle 0%. Memory ist nicht knapp, Paging kaum
  2. top sagt: eine oc4j-Instanz verursacht die prozessorlast
  3. die log-files sind leer! (0 bytes)
  4. jvm-stacktrace ergibt keine weiteren auffälligkeiten (kein anwendungscode im stacktrace, mostly waits oder Input/outputs)

Wir spielen das vorletzte build ein, welches am tag zuvor noch gelaufen ist.

Analyse:

  1. redeploy sehr langsam
  2. symptom und analyseergebnisse bleiben gleich

Wir rufen beim betrieb an.

Ergebnis: Filesystem voll!

nachdem der betrieb das problem behoben hatte, lief die anwendung (nach dem redeploy der aktuellen version) wieder normal.

·

Schon seit einiger Zeit bin ich zufriedener Nutzer von "Safari Books Online". Dort kann man IT-Bücher online - gegen ein monatliches Entgelt versteht sich.

Es gibt einen 14-Tage Test-Zugang. Hier 6 Gründe, wozu man diesen Testzugang nutzen kann:

  1. Hast Du von einem interessanten Fachbuch gelesen oder gehört? Dann schau nach, ob es dieses Buch online bei Safari gibt, und wenn ja, ob es hält, was es verspricht.
  2. Planst Du, ein Buch "in Papierform" zu erwerben und kannst noch nicht beurteilen, ob es "das Richtige" ist? Dann hast Du die Möglichkeit, es online "durchzublättern" und eine beliebig umfangreiche Leseprobe vorzunehmen.
  3. Was gibt es für Bücher zu dem Gebiet, auf dem Du gerade arbeitest? Vielleicht beleuchtet das eine oder andere Aspekte, in die Du noch nicht so tief vorgedrungen bist oder gibt weiterführende Tipps.
  4. Willst Du Dein Wissen über aktuelle Themen in der IT erweiterten, dann suche Dir Bücher zu diesen Themen heraus (z.B. Service Oriented Architecture, Model Driven Architecture, …)
  5. Vielleicht gibt es ein "klassisches" Buch, in das Du schon immer mal einen Blick werfen wolltest (z.B. "Code Complete" von Steve McConnell).
  6. Last But not Least: (Technologie-neutrale) Buchempfehlungen für Softwareentwickler von der IEEE Computer Society

Es gibt übrigens auch Bücher zum Thema "IT Management", Karriere u.ä.

Kürzlich wurde Version 2.0 von JAMon veröffentlicht. JAMon ist eine kleine, für Java-Anwendungen nützliche Monitoring-Bibliothek.

In Version 1 gab es die Möglichkeit, Ausführungszeiten von Code programmatisch zu messen:

JAVA:
  1.  
  2. Monitor m = MonitorFactory.start("berechnung");
  3. BerechnungsModul.berechne();
  4. m.stop();
  5.  

misst die Ausführungszeit der berechne-Methode. Das interessante hierbei ist

  1. Statistiken werden über die Ausführungszeiten (genauer: Ausführungsdauer) erstellt (Summe, Mittelwert, Standardabweichung und sogar Einteilung in bestimmte Klassen),
  2. Ausführungszeiten werden Namen gegeben (hier "berechnung") und
  3. Die Statistiken können als HTML-Report ausgegeben (programmatisch oder per JSP).

Damit ist schon viel getan, u.a.:

  • in Webanwendungen kann ich einen Servletfilter erstellen, der die Ausführungsdauer aller (oder nur bestimmter) Aufrufe misst (dies hat bei geringem Aufwand großen Nutzen),
  • Aufrufe an "externe Systeme" (z.B. Datenbank, Web-Services oder Betriebssystem) können gemessen werden
  • anhand der Messergebnisse kann der Entwickler abschätzen, ob eine Optimierung notwendig ist
  • anhand der Messergebnisse (z.B. im Vergleich zum Vortag) kann der Betrieb abschätzen, ob sich das System derzeit aussergewöhnlich verhält.

In Version 2 (ein komplettes Redesign) kommt hinzu, dass ich nicht nur Zeiten messen kann, sondern beliebige Einheiten. Ich kann z.B. eine Statistik über die Trefferzahl einer Suche führen:

JAVA:
  1.  
  2. int treffer = Suche.ausfuehren(...)
  3. MonitorFactory.add("treffer","anzahl",treffer);
  4.  

fügt die Trefferzahl dem Statistikeintrag "treffer", die in der Einheit "anzahl" gemessen wird, zu. Bisher habe ich nur noch nicht herausgefunden, wie man Klassen (im Sinne von "Unterteilung des Wertebereiches") für nutzerdefinierte Einheiten definieren kann.
Alles in allem ein Tool, welches einen großen Nutzen bringt. Das Spring-Framework unterstützt JAMon.

·

Theme Design by devolux.nh2.me