Montag, 11. Mai 2009

Google Collections

Die Google Collections bieten inzwischen eine recht ansehnliche und interessante Auswahl an. Besonders interessant für Caching Funktionen ist die MapMaker Klasse. Die bringt nämlich gleiche eine Unterstützung für Soft- und Weak Referenzen sowie eine zeitliche Haltegrenze mit.

Softreferenzen gibt es seit Java 1.2 und werden so lange vom Garbage Collector verschont, wie sie nicht anderweitig referenziert werden und der Speicher ausreicht. Wird der Speicher knapp, werden die über Softreferenzen referenzierten Objekte weggeräumt.

Weakreferenzen gibt es ebenfalls seit Java 1.2. Die von Weakreferenzen referenzierten Objekte werden immer dann vom Garbage Collector entfernt, wenn die referenzierten Objekte an keiner anderen Stelle mehr referenziert werden. Grundsätzlich gilt für die Soft- wie auch für die Weak Referenz, dass nur weggeräumt wird, wenn keine "stärkere" - also "normale" Referenz mehr vorhanden ist.

Der Timeout für Objekte in der MapMaker Klasse ist interessant, wenn auch nicht so locker einsetzbar, wie man auf den ersten Blick zu meinen glaubt. Der Timeout wird nämlich in einem statischen Zeitrahmen vergeben. Man kann also festlegen, das ein Objekt für eine fixe Zeit von z.B. 10 Minuten gehalten werden soll. Das macht aber nur dann wirklich sinn, wenn die Anwendungslogik das hergibt - man also weiß, dass Objekte tatsächlich nach einer bestimmten Zeit mit hoher Warscheinlichkeit nicht mehr benötigt werden. Werden die Objekte auch nach der fixen Zeit doch noch benötigt, heißt das, dass diese neu gebaut werden müssen. Interessant wird der MapMaker vor allem in Kombination mit Weak- und Soft Referenzen. Man kann also z.B. festlegen, dass Objekte nur so lange im MapMaker verweilen, wie sie keine "stärkeren" Referenzen mehr haben, jedoch auch nicht länger als 10 Minuten.

Benötigt man nur eine HashMap mit Weak Referenzen, bietet sich übrigens auch die java.util.WeakHashMap an, die es seit Java 1.4 gibt.

Beispiel:


 ConcurrentMap graphs = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(
new Function() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});

Links: Google Collections, MapMaker (Javadoc)

Keine Kommentare:

Kommentar veröffentlichen