Ich verwende einen SoftReference-basierten Cache (eine ziemlich einfache Sache an sich). Allerdings habe ich ein Problem beim Schreiben eines Tests dafür gefunden.Wie macht das Java-System Soft References frei?
Das Ziel des Tests besteht darin, zu überprüfen, ob der Cache das zuvor zwischengespeicherte Objekt erneut vom Server anfordert, nachdem die Speicherbereinigung durchgeführt wurde.
Hier finde ich das Problem, wie das System weiche referenzierte Objekte freigeben kann. Das Aufrufen von System.gc() reicht nicht aus, da weiche Referenzen erst freigegeben werden, wenn der Arbeitsspeicher niedrig ist. Ich führe diesen Komponententest auf dem PC durch, so dass das Speicherbudget für die VM ziemlich groß sein könnte. später
================== Hinzugefügt ========================== ====
Vielen Dank an alle, die darauf geachtet haben, zu antworten!
Schließlich Pro und Contra des bedenkt, dass ich die Brute-Force-Weg zu gehen, entschieden haben, wie von nanda und Jarnbjo beraten. Es scheint jedoch, dass JVM nicht so dumm ist - es wird nicht einmal Müll sammeln, wenn man nach einem Block fragt, der allein größer ist als das Speicherbudget von VM. Also habe ich den Code wie folgt geändert:
/* Force releasing SoftReferences */
try {
final List<long[]> memhog = new LinkedList<long[]>();
while(true) {
memhog.add(new long[102400]);
}
}
catch(final OutOfMemoryError e) {
/* At this point all SoftReferences have been released - GUARANTEED. */
}
/* continue the test here */
IMHO verwenden Sie eine sehr spröde (und nicht deterministische?) Testkonfiguration, um die Java VM Soft Reference Funktionalität zu testen, anstatt Ihre eigene Anwendungslogik zu testen. – Ruben
Ja, ich stimme zu. Es war einer der Kontra für diesen Ansatz. Mit diesem Ansatz machen Sie jedoch genau das, was der Test tun muss - testen Sie den Vertrag des Geräts. Wenn ich den anderen Weg nehmen würde, würde es die Interna der Einheit testen - was unerwünscht ist, da es die Kapselung verletzt, und führt auch unnötige Abhängigkeit ein. Aber Sie haben Recht - in meinem Test hängt es vom Verhalten der VM im Falle einer Speicherkrise ab. Im Java-Standard heißt es, dass VM * Soft-Referenzen freigibt, bevor OutOfMemoryError geworfen wird - nun, hoffen wir, dass es tatsächlich so ist. – JBM
+1, dies half mir, ein Problem zu debuggen, bei dem ich dachte, Swing habe Speicher verloren, aber es war wirklich nur weiche Referenzen auf einige Anwendungsobjekte. – casablanca