Utilizzerò una cache basata su SoftReference (una cosa piuttosto semplice di per sé). Tuttavia, mi sono imbattuto in un problema durante la scrittura di un test per questo.Come rendere la versione di sistema java Soft References?
L'obiettivo del test è verificare se la cache fa richiedere nuovamente l'oggetto memorizzato in precedenza dal server dopo la pulizia della memoria.
Qui trovo il problema di come rendere il sistema in grado di rilasciare oggetti di riferimento morbidi. Chiamare System.gc() non è sufficiente perché i riferimenti software non verranno rilasciati fino a quando la memoria non è in esaurimento. Sto eseguendo questo test unitario sul PC, quindi il budget di memoria per la VM potrebbe essere abbastanza grande.
================== aggiunti in seguito ========================== ====
Grazie a tutti coloro che si sono premurati di rispondere!
Dopo aver considerato tutto di contra pro e ho deciso di andare il modo in cui la forza bruta come consigliato dal Nanda e jarnbjo. È apparso, tuttavia, che JVM non è così stupido - non tenterà nemmeno di raccogliere i rifiuti se chiedete un blocco che da solo è più grande del budget di memoria della VM. Così ho modificato il codice come questo:
/* 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 si sta utilizzando una configurazione di prova molto fragile (e non deterministica?) Per testare la funzionalità di riferimento software Java VM, invece di testare la propria logica dell'applicazione. – Ruben
Sì, sono d'accordo. È stato uno dei contrari per questo approccio. Tuttavia, con questo approccio fai esattamente ciò che il test deve fare - testare il contratto dell'unità. Se avessi preso l'altro modo, testerebbe le parti interne dell'unità, il che è indesiderabile in quanto viola l'incapsulamento e introduce anche una dipendenza non necessaria. Ma hai ragione - nel mio test dipende dal comportamento della VM in caso di crisi della memoria. Nello standard java si dice che VM * rilascerà i soft reference prima di lanciare OutOfMemoryError - beh, speriamo che lo faccia davvero. – JBM
+1, questo mi ha aiutato a eseguire il debug di un problema in cui pensavo che Swing perdesse memoria, ma in realtà conteneva solo riferimenti software ad alcuni oggetti dell'applicazione. – casablanca