Donnerstag, 11. März 2010
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.

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:
Dienstag, 13. Oktober 2009
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.
Freitag, 2. Oktober 2009
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/
Montag, 28. September 2009
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
Donnerstag, 26. März 2009
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).
Dienstag, 10. Februar 2009
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.