Name

JRat - The Java Runtime Analysis Toolkit

Homepage

http://jrat.sourceforge.net/

Lizenz

Lesser General Public License (LGPL)

Untersuchte Version

Version 1-beta1

Letzter Untersuchungszeitpunkt

24.11.2010

Kurzbeschreibung

JRat ist ein einfach zu handhabendes Tool zur Laufzeitanalyse von beliebigen Java-Programmen.

Fazit

JRat ist ein einfach zu handhabendes Tool und sehr praktisch für einen schnellen und unkomplizierten Einsatz. Es ist keine aufwändige Installation nötig. Die Dokumentation ist zwar sehr knapp gehalten, ist aber im Fall von JRat völlig ausreichend.
Da das Tool im Funktionsumfang relativ eingeschränkt ist, bietet es kaum Möglichkeiten für flexible Anpassungen.
Die Aktualität des Projektes lässt etwas zu wünschen übrig. Regelmäßige Updates und ein mühevoller gehaltenes Forum wären sicher wünschenswert.

Einsatzgebiete

Laufzeitanalyse von Java-Programmen.

Einsatzumgebungen

JRat ist plattformunabhängig in jeder javafähigen Laufzeitumgebung (ab v1.4) anwendbar, da es selbst komplett auf Java basiert.

Installation

Die aktuelle Version von JRat kann über die auf der Projekt-Homepage angegebene URL heruntergeladen werden.
Anschließend kann die zip-Datei in einen beliebigen Ordner entpackt werden. Der Ordner beinhaltet lediglich eine mit einer Java Runtime startbare Datei shiftone-jrat.jar und einen Ordner docs, welcher eine Offline-Dokumentation im HTML-Format enthält.
Die Tool-Oberfläche kann daraufhin z.B. über den Befehl java -jar shiftone-jrat.jar gestartet werden.

Dokumentation

Eine Offline-Dokumentation im HTML-Format ist im Programm-Download enthalten und auch über die GUI einsehbar. Die selben Informationen sind ebenfalls auf der Projekt-Homepage zu finden, sowie ein Web Start Demo, welche das Tool startet und lediglich eine fertige .jrat-Datei zur Ansicht lädt.

Wartung der Projektseite

Die relativ übersichtliche Webseite ist klar strukturiert, enthält aber recht wenig Detailinformationen.
Im Download-Bereich ist allerdings zu sehen, dass zwischen Version 0.71b und 1-alpha2 fast zweieinhalb Jahre vergangen sind und die erste beta-Version 1-beta1 noch ein Jahr länger auf sich warten ließ. Diese zur Untersuchung genutzte Version wurde seit drei Jahren nicht aktualisiert, so dass die Vermutung nahe liegt, dass die Entwicklung eingestellt wurde.

Nutzergruppen und Support

Es existiert ein Forum, auf welchem einige Einträge zu finden sind, die jedoch seltener, bzw. seit einem Jahr gar nicht beantwortet werden.

Intuitive Nutzbarkeit

JRat ist sehr einfach zu benutzen und lässt sich ohne Probleme trotz knapper Benutzeranleitung leicht einsetzen. Auch die vom Tool erzeugten Ergebnisse sind gut zu verstehen.

Automatisierung

JRat bietet von Haus aus keine spezielle Automatisierungsunterstützung. Jedoch lässt sich ein Laufzeittest einfach mit der JavaVM-Option -javaagent starten. So kann diese Erweiterung z.B. in der Entwicklungsumgebung Eclipse in den JavaVM-Einstellungen fest eintragen werden, so dass die Testroutine bei jeder Programmausführung automatisch gestartet wird.

ANT
Wie bereits weiter oben erwähnt, besteht keine Unterstützung für eine Automatisierung in Ant. In diesem Fall kann der Test aber automatisiert über Ant gestartet werden. Dazu muss der Aufruf um die JVM-Einstellung -javaagent erweitert werden. Die Analyse und Darstellung der Ergebnisse muss dabei weiterhin über die JRat Software geschehen. Zwar entstehen durch die Tests auch zwei lesbare Formate (jrat.log und memory.csv), allerdings enthalten diese nicht die gewünschten Informationen. Diese befinden sich in der Datei my_code_tree.jrat. Diese Datei kann mittels der JRat-Software analysiert werden. Ant unterstützt in diesem Szenario die automatisierte Ausführung des Laufzeitstests.
Eine Beispielautomatisierung ist hier zu finden.
Maven
Wie unter dem Punkt ANT kurz erläutert wurde, bietet JRat keine Unterstützung zur Automatisierung in ANT oder Maven. Beim ANT-Beispiel kann die Ausführung von JRat über einen simulierten Konsolenaufruf durchgeführt werden. Dazu muss bei der Ausführung ein JVM-Argument gesetzt werden. Da Maven nicht dafür ausgelegt ist, ein bestehendes Programm auszuführen sondern eigentlich nur den build-Prozess zu unterstützen, muss auf eine externes Plugin von codehaus zurückgegriffen werden. Allerdings besteht bei diesem Plugin das Problem das der JVM keine Argumente übergeben werden können und somit JRat nicht gestartet wird.

Einführendes Beispiel

Um mit JRat eine Laufzeitanalyse durchzuführen, ist es lediglich notwendig der JavaVM mit dem zusätzlichen Parameter -javaagent:.. mitzuteilen, dass JRat die vom Agent abgefangenen Meldungen mithören kann.
Auf der Konsole wird die Laufzeitanalyse mit folgender Zeile gestartet: z.B.:

java -javaagent:path/to/shiftone-jrat.jar [java options] [main class]

Die Datei shiftone-jrat.jar wird hierzu zunächst in das bin-Verzeichnis des Projektes "Polygon" kopiert. Von hier aus wird dann das Programm mit im Hintergrund laufender Laufzeitanalyse gestartet:

java -javaagent:shiftone-jrat.jar de.fhwiesbaden.poly.PolygonGUI

Es erscheinen einige Meldungen von JRat auf der Konsole, welche, abgesehen von einem Fehlerfall, ignoriert werden können.
Das Programm öffnet sich und kann wie gewohnt benutzt werden. Sobald das Programm gestartet wurde werden in diesem Beispiel folgende Dateien und Ordner angelegt:
	
		jrat.output
			2009-01-05_PM-04-00-40
				jrat.log
				memory.csv
		jrat.xml
	
	
Die Dateien mit dem Format .log bzw. .csv werden bei jedem gefangenen Event aktualisiert.

Bei Beendigung des Programms wird im Ordner 2009-01-05_PM-04-00-40 zusätzlich die Datei my_code_tree.jrat angelegt. Diese ist offensichtlich eine für JRat generierte Datei, welche die Informationen aus der vorhanden Log- bzw. CSV-Datei vereint und für das Tool lesbar macht.

Nun kann die grafische Oberfläche von JRat mit dem Befehl java -Xmx256M -jar shiftone-jrat.jar gestartet werden.
(Der Parameter -Xmx256MB ruft hierbei eine Beschränkung des maximal zu verwendenden Arbeitsspeichers von 256 MB hervor).
Über "File"->"Open" kann nun in den Ordner gewechselt und die gewünschte .jrat-Datei geöffnet werden.

Daraufhin werden die Statistiken anhand folgender drei Ansichten angezeigt.
(Ausführliche Erklärungen zu den Tabellenspalten lassen sich über das Glossar auf der JRat-Homepage abrufen):

Detaillierte Beschreibung

Eine funktionelle Beschreibung ist hier zu finden:

Diese erkärt, mit welcher Arbeitsweise JRat durch injizierten Code das Original-Programm erweitert, um sie dem Java-Agent sichtbar zu machen. Hierbei wird nicht der Quellcode geändert, sondern der Bytecode, so dass die .class-Dateien die Informationen beinhalten.

Eine einfache Methode "MyClass"


		public class MyClass {
	    	public Object doSomething() {
	        	// do something
		    }
		}
	

wird wie folgt ergänzt:


		public class MyClass {
			private static final MethodHandler handler = HandlerFactory.getHandler(...) {
				public Object doSomething() {
					handler.onMethodStart(this);
					long startTime = Clock.getTime();
				try {
					Object result = real_renamed_doSomething(); // call your method
					handler.onMethodFinish(this, Clock.getTime() - startTime, null);
				} catch(Throwable e) {
					handler.onMethodFinish(this, Clock.getTime() - startTime, e);
					throw e;
				}
			}
			public Object real_renamed_doSomething() {
				// do something
			}
		}
	

Die Konfiguration, wie hier beschrieben, liegt als Datei jrat.xml im Programmordner vor und teilt JRat mit, wie auf Pakete, Klassen und Methoden reagiert werden soll.
Ist keine Konfigurationsdatei vorhanden, wird diese automatisch mit Standardeinträgen generiert und sieht wie folgt aus:

		<jrat>
		    <settings>
		        <property name="httpServerEnabled" value="true"/>
		    </settings>

		    <profile name="my code">

		        <criteria>
		            <include/>
		        </criteria>

		        <handlers>

		            <handler factory="org.shiftone.jrat.provider.tree.TreeMethodHandlerFactory">
		                <property name="outputFile" value="my_code_tree.jrat"/>
		            </handler>

		        </handlers>

		    </profile>
		</jrat>
	

Im Abschnitt "profile" der Datei können Handler definiert werden, welche der Aktionsbehandlung dienen, um Events in Methoden abzufangen. Es können mehrere Handler in einer Konfigurationsdatei definiert werden.

Auswahlkriterien für Methoden und Klassen werden anhand folgender Notation im Abschnitt "criteria" eingetragen:

		<include className="*" methodName="*" signature="*"/>
		<exclude className="*" methodName="*" signature="*"/>
	

Hiermit ist es möglich, Methoden und Klassen explizit zu erlauben bzw. von der Behandlung durch den Eventhandler auszuschließen.
Der "Tree Method Handler", welcher standardmäßig inkludiert ist, ist für allgemeine Zwecke völlig ausreichend.
Es ist jedoch ohne Weiteres möglich in einer eigenen Klasse die "MethodHandlerFactory" zu implementieren und einen eigenen Eventhandler zu definieren, welcher auf benutzerdefinierte Events reagieren kann.

Literatur

keine.

Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite