28. Februar 2008

Garbage Collector analysieren

Über folgende Java-Optionen kann ein Garbage-Collector-Logfile geschrieben werden:

-XX:+PrintGC -XX:+PrintGCTimeStamps -Xloggc:logs/gcoutput.log

Zur Analyse können folgende Tools verwendet werden:

- HPjtune, bzw. dessen Nachfolger HPjmeter Console
- Tagtraum GCViewer

13. Februar 2008

jstat, jmap, jps,... funktioniert nicht wenn der Java-Prozess per Windows "Scheduled Task" gestartet wurde

Problem: Ein Java-Prozess wird per Schedulded Task gestartet. Wenn JDK-Tools wie jmap, jps oder jstat auf diesen Prozess verwendet werden, erhält man die Fehlermeldung "process information unavailable" oder "Not enough storage is available to process this command".

Workaround: Eine zweite Scheduled Task anlegen, die das gewünschte Tool ausführt, dann funktioniert der Zugriff auf den anderen, per Scheduled Task gestarteten Java-Prozess.

12. Februar 2008

JMeter und JSF

Problem: Bei JSF gibt es die Besonderheit, dass auf der Clientseite in einem "hidden field" ein ViewState gespeichert wird. Dieser ermöglicht dem Server die Zuordung zu einem ComponentTree. Der Inhalt dieses Feldes variiert bei jedem Aufruf und muss immer mitgeschickt werden. Mit einem Standard-JMeter-Test ist dies nicht möglich.

Lösung: Durch die Verwendung eines "Regular Expression Extractor" kann immer der richtige Feldinhalt mitgeschickt werden.

Schritt 1:

Bei JMeter muss in der Thread Gruppe ein "Regular Expression Extractor" angelegt werden mit folgenden Eigenschaften:

Für die SUN-RI:
  • Respons Field to check: body
  • Reference name: jsfViewState
  • Regular Expression: <input type="hidden" name="com\.sun\.faces\.VIEW" id="com\.sun\.faces\.VIEW" value="(.+?)" />
  • Template: $1$
  • Match No.: 0
  • Default Value: leer
Für Apache MyFaces:
  • Respons Field to check: body
  • Reference name: jsfViewState
  • Regular Expression: <input type="hidden" name="javax\.faces\.ViewState" id="javax\.faces\.ViewState" value="(.+?)" />
  • Template: $1$
  • Match No.: o
  • Default Value: leer
Schritt 2:

Bei jeder aufgezeichneten JSP im Recording Controller muss unter "Parameter die mit dem Request gesendet werden" die oben definierte Variable gesetzt werden:
  • bei SUN RI
    • Das Feld "com.sun.faces.VIEW" mit dem Wert "${jsfViewState}" überschrieben werden
  • bei Apache MyFaces
    • Das Feld "javax.faces.ViewState" mit dem Wert "${jsfViewState}" überschrieben werden

8. Februar 2008

JMeter Webtest aufzeichnen und abspielen

Schritt 1: Vorbereitung im JMeter
  • Unter Testplan
    • Eine neue Threadgruppe anlegen
      • Einen HTTP Cookie Manager anlegen (damit Cookie-basierte Anwendungen funktionieren und die Session zugeordnet werden kann)
      • Alternativ kann auch ein HTTP URL Re-writing Modifier angelegt werden
        • als Session Argument Name muss dort z.B. jsessonid hinterlegt werden
      • Einen Recording Controller anlegen
        • in diesem werden die Aufzeichnungen des Http Proxy Server abgelegt
  • Unter Workbench
    • Einen Http Proxy Server anlegen
      • Als Target Controller den Recording Controller auswählen

Schritt 2: Test aufzeichnen
  • Browser öffnen und als Proxy Server den Port eingeben der im JMeter beim Http Proxy Server angegeben wurde (Default=8080)
  • Browser-Cache und Cookies löschen
  • Im JMeter beim Http Proxy Server auf "Start" drücken
  • Gewünschte Seiten im Browser aufrufen
  • Im JMeter beim Http Proxy Server auf "Stop" drücken
Schritt 3: Test nachbearbeiten
  • Die Seiten wurden im Recording Controller abgelegt, dort können Sie nachträglich nachbearbeitet werden, z.B. durch Variablen
Schritt 4: Tests abspielen
  • In der Threadgruppe kann nun die Häufigkeit und Parallelität der Ausführung gewählt werden
  • Zur Auswertung des Ergebnis sollten der Threadgruppe nun noch Lauscher (Listeners) hinzugefügt werden (z.B. Summary Report)
  • Über das Menü Start/Start kann der Test gestartet werde

5. Februar 2008

synchronized bei Methoden

normales Methoden-synchronized

public class MyClass
{
...
public synchronized int rechne()
{
// Code hier
}
...

}

entspricht

public class MyClass
{
...
public int rechne()
{
synchronized(this)
{
// Code hier
}
}
...

}

synchronized bei einer statischen Methode

public class MyClass
{
...
public static synchronized int machwas()
{
// Code hier
}
...

}

entspricht

public class MyClass
{
...
public static int machwas()
{
synchronized(MyClass.class)
{
// Code hier
}
}
...

}

4. Februar 2008

Thread Dumps erzeugen unter Java

Vor JDK 1.5

Windows:


"Ctrl" + "Break" erzeugt einen Thread Dump in Standard-Out

Linux/Unix:

kill -3 <pid> erzeugt einen Thread Dump in Standard-Out


Ab JDK 1.5


Über das Tool jstack aus dem Java SDK:

jstack <pid> >stack.txt


Analyse-Tools:
  • TDA (OpenSource-Tool) Thread Dump Analyzer zur Analyse von Textfiles-Dumps:
    • Threads waiting for a monitor:
      • Ein Thread wartet vor einem synchronized-Block, der gerade von einem anderen Thread durchlaufen wird
    • Threads sleeping on a monitor:
      • Ein Thread ist innerhalb eines sychronized-Blocks und ruft dort wait() auf