Java Anwendung gegen JVM Absturz testen

Ab und zu könnte es von Vorteil sein, die programmierte Anwendung auch gegen die Einflussfaktoren außerhalb der JVM zu testen. Was passiert z. B. wenn die JVM unerwartet abschmiert, während die Anwendung ihre Daten noch im RAM lagert und diese noch nicht persistiert hat? Kann die Anwendung solche Aktion verkraften und nach dem Absturz dann wieder normal hochfahren? Dies lässt sich mit dem folgenden Java Schnipsel herausfinden:

package de.oio.blog;

import java.lang.reflect.Field;

import sun.misc.Unsafe;

public class CrashTest {

	public static void main(String[] args) {
		Unsafe unsafe = getUnsafe();
		unsafe.setMemory(0, 1, (byte) 0);
	}

	public static Unsafe getUnsafe() {
	    try {
	    	Field field = Unsafe.class.getDeclaredField("theUnsafe");
	        field.setAccessible(true);
	        return (Unsafe) field.get(null);
	    } catch (Exception e) {
	        throw new AssertionError(e);
	    }
	}

}

In der Main-Methode wird die JVM zum Absturz gebracht, indem absichtlich eine Speicherzugriffsverletzung programmiert wird. Mit der Hilfsmethode getUnsafe() wird zunächst ein Speicherbereich ermittelt, der dem Anwendungsprozess selbst nicht zur Verfügung steht. Als nächstes erfolgt ein Schreibzugriff auf diesen Speicherbereich. Und hier reagiert das Betriebssystem, indem es den Schreibzugriff verweigert. Die JVM schmiert aufgrund dieser Aktion mit folgender Ausgabe ab:

#

# A fatal error has been detected by the Java Runtime Environment:

#

#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d892147, pid=2228, tid=3920

#

# JRE version: 6.0_24-b07

# Java VM: Java HotSpot(TM) Client VM (19.1-b02 mixed mode, sharing windows-x86 )

# Problematic frame:

# V  [jvm.dll+0xa2147]

#

# An error report file with more information is saved as:

# C:Dokumente und Einstellungenuserworkspaceblogtestshs_err_pid2228.log

#

# If you would like to submit a bug report, please visit:

#   http://java.sun.com/webapps/bugreport/crash.jsp

#

Noch eine kleine Bemerkung zur Verwendung von der Klasse Unsafe. Die Verwendung dieser Klasse wird standardmäßig vom Compiler sofort als Error mit folgender Meldung erkannt:

Access restriction: The type Unsafe is not accessible due to restriction on required library C:ProgrammeJavajre6librt.jar

In Eclipse lässt sich dieses Error sehr einfach deaktivieren. Dafür klickt man sich folgendermaßen durch:

Window->Preferences->Java->Compiler->Errors/Warnings->Deprecated and Restricted API

Dann müssen nur noch Forbidden und Discouraged Reference zu einem anderen Wert anstatt auf Error gesetzt werden. Das war es!

This entry was posted in Java and Quality, Java Runtimes - VM, Appserver & Cloud, Security and tagged , , , , . Bookmark the permalink.

Leave a Reply