Tag Archives: Java

Java – Heap Dump Analyse

Von Zeit zu Zeit kommts leider vor, dass man trotz Garbage Collection und den Automatismen der JVM trotzdem ein Speicherproblem bekommt.

Da hilft dann nur eine Heap Dump Analyse.

Hierzu muss man die JVM in der das Tool läuft vorbereiten. Der Parameter lautet: -XX:+HeapDumpOnOutOfMemoryError

Mittels des Tools HeapAnalyzer von IBM kann man den Dump dann angucken. Man sollte der JVM allerdings genug Speicher geben, da die Dump-Dateien schon mal groß werden können.

java -Xmx1500m -jar ha395.jar dump.hprof

Das Laden dauert ein bisschen. Anschließend sieht man (gleich vorausgewählt) die größten Verdächtigen.

com.ibm_.jinwoo.heap_.HeapAnalyzer.rGnoxbrGJmLv.jpg

Das hilft allerdings leider nur begrenzt bzw. manchmal gar nix, aber man hat noch einen Strohhalm an den man sich klammern kann ;)

Unterhalb der Version 1.4.2_12 kann man das auch getrost vergessen.

Quellen und Downloads:

Hibernate – org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 1 expected

Grade hatte ich einen Fehler, der mich fast in den Wahnsinn getrieben hat. Ich nutze Hibernate in einem Projekt und bilde damit viele Abhängigkeiten recht komfortabel ab.

Da meine Werte aus einem Form kommen, muss ich Datentypen entsprechend umwandeln. Dies bedeutet, dass alles was kein String ist, gecastet werden muss. Soweit so gut. Allerdings kommt Hibernate (mit Recht muss ich im Nachhinein sagen) nicht damit klar, wenn ich bei einem Fremdschlüssel 0 statt null hinterlegt habe. Hibernate versucht in der Referenztabelle diesen Key zu finden und das schläg natürlich fehl, da ich z.B. einen MySQL Primary Key verwende (der startet bei 1).

Die Fehlermeldung allerdings hat mich erstmal ratlos gelassen, da ich natürlich mehrere Änderungen gemacht hatte. Es wird nicht so richtig klar, dass Hibernate an der Fremdschlüssel-Auswertung scheitert.

Again what learned,

euer Loddar

Siehe auch: Laliluna: org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected.

Maven – log4j Abhängigkeiten

Wenn man log4j als Abhängigkeit in Maven einbinden will, stolpert man seit der Version 1.2.15 über eine Abhängigkeit zu Sun Paketen. Diese werden nicht in den Opensource Repos von Maven untergebracht (wegen Lizenz-rechtlichen Gründen).

Man kann allerdings die transitiven Abhängigkeiten ausschließen:

 		<exclusions>
  			<exclusion>
  				<groupId>com.sun.jmx</groupId>
  				<artifactId>jmxri</artifactId>
  			</exclusion>
  		</exclusions>

Zu dem scheint es mittlerweile ein Sun-Maven-Repo zu geben. Zu finden unter

https://maven-repository.dev.java.net/

Via http://www.2rue.de/hacking/log4j-und-jmx-maven-dependencies/

Maven – Hibernate Abhängigkeitsproblem

Wenn man in Maven Hibernate einbinden will, kann es sein, dass man eine Fehlermeldung à la

Missing indirectly referenced artifact
javax.transaction:jta:jar:1.0.1B:compile

bekommt, muss man das JTA per Hand (oder über ein Dritt-Repository) installieren, da es aus Lizenz-technischen Gründen nicht im Maven Repository gehalten wird.

Herunterladen kann man sich das Ganze unter: http://java.sun.com/javaee/technologies/jta/index.jsp

Der Befehl ist:

mvn install:install-file -Dfile=./jta-1_0_1B-classes.zip
-DgroupId=javax.transaction -DartifactId=jta
-Dversion=1.0.1B -Dpackaging=jar

via http://programmers-blog.com/2008/05/24/maven-missing-jta-artifact

HowTo – Ubuntu Tomcat Autostart

Vieles ist in Linux einfach zu bewerkstelligen, ein paar Sachen sind etwas mit Wissen zu hinterlegen bevor man sie durchführt. So auch das Starten von Applikationen beim Bootvorgang.

Nehmen wir als Beispiel mal einen Tomcat App Server. Das Programm gibt einem schon Skripte zum starten und beenden an die Hand. Das ist eigentlich auch alles was man zum weiteren Vorgehen braucht.

Im Verzeichnis /etc/init.d sind bei Linux üblicherweise die Startskripten abgelegt. Diese stellen im Normalfall 4 Parameter zur Verfügung (start/stop/restart/force-reload). Zum Starten brauchen wir… Trommelwirbel… den Start-Parameter.

Wir legen also nun für den Tomcat unter /etc/init.d eine Datei namens tomcat an (mit Root-Rechten).

sudo vi /etc/init.d/tomcat

Es kann auch jeglicher anderer Editor, wie z.B. nano genommen werden.

Anschließend befüllen wir die Datei mit Inhalt:

# Autostart script for tomcat

CATALINA_HOME=path-to-tomcat-directory
export JRE_HOME=path-to-jre-directory

case $1 in
start)
sudo -u username sh $CATALINA_HOME/bin/startup.sh
;;
stop)
sudo -u username sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
sudo -u username sh $CATALINA_HOME/bin/shutdown.sh
sudo -u username sh $CATALINA_HOME/bin/startup.sh
;;
force-reload)
sudo -u username sh $CATALINA_HOME/bin/shutdown.sh
sudo -u username sh $CATALINA_HOME/bin/startup.sh
;;
esac
exit 0

Damit können wir schon recht komfortabel den Kater starten, aber nur manuell. Aber zumindest sind mal die einzelnen Skriptaufrufe weggekapselt.

Zum Autostart verwendet Linux sogenannte Runlevel. Natürlich hat jede größere Distribution da andere.

sudo ln -s /etc/init.d/tomcat /etc/rc1.d/K99tomcat
sudo ln -s /etc/init.d/tomcat /etc/rc2.d/S99tomcat

Obige Zeilen bedeuten, dass der Tomcat im Multiusermode (rc2) gestartet wird (S99), aber beim Betreten des Singleusermode (rc1) gestoppt wird (K99).

MySQL – Profiler

Grade drüber gestolpert: Jet Profiler von Polaricon. Die Freeware-Version ist etwas eingeschränkt, man kann keine Benutzer unterscheiden und es werden leider keine Slow Queries gezeigt. Aber zum Testen und auf Dev-Maschinen sicher einen Blick wert.