@@ -338,6 +338,19 @@ public void clear() {
338
338
}
339
339
}
340
340
341
+ /**
342
+ * Remove any entries that have been garbage collected and are no longer referenced.
343
+ * Under normal circumstances garbage collected entries are automatically purged as
344
+ * items are added or removed from the Map. This method can be used to force a purge,
345
+ * and is useful when the Map is read frequently but updated less often.
346
+ */
347
+ public void purgeUnreferencedEntries () {
348
+ for (Segment segment : this .segments ) {
349
+ segment .restructureIfNecessary (false );
350
+ }
351
+ }
352
+
353
+
341
354
@ Override
342
355
public int size () {
343
356
int size = 0 ;
@@ -512,7 +525,7 @@ public void clear() {
512
525
* references that have been garbage collected.
513
526
* @param allowResize if resizing is permitted
514
527
*/
515
- private void restructureIfNecessary (boolean allowResize ) {
528
+ protected final void restructureIfNecessary (boolean allowResize ) {
516
529
boolean needsResize = ((this .count > 0 ) && (this .count >= this .resizeThreshold ));
517
530
Reference <K , V > reference = this .referenceManager .pollForPurge ();
518
531
if ((reference != null ) || (needsResize && allowResize )) {
@@ -550,7 +563,7 @@ private void restructureIfNecessary(boolean allowResize) {
550
563
restructured [i ] = null ;
551
564
}
552
565
while (reference != null ) {
553
- if (!toPurge .contains (reference )) {
566
+ if (!toPurge .contains (reference ) && ( reference . get () != null ) ) {
554
567
int index = getIndex (reference .getHash (), restructured );
555
568
restructured [index ] = this .referenceManager .createReference (
556
569
reference .get (), reference .getHash (),
@@ -564,7 +577,7 @@ private void restructureIfNecessary(boolean allowResize) {
564
577
if (resizing ) {
565
578
setReferences (restructured );
566
579
}
567
- this .count = countAfterRestructure ;
580
+ this .count = Math . max ( countAfterRestructure , 0 ) ;
568
581
} finally {
569
582
unlock ();
570
583
}
@@ -974,6 +987,7 @@ public void release() {
974
987
enqueue ();
975
988
clear ();
976
989
}
990
+
977
991
}
978
992
979
993
@@ -1007,6 +1021,7 @@ public void release() {
1007
1021
enqueue ();
1008
1022
clear ();
1009
1023
}
1024
+
1010
1025
}
1011
1026
1012
1027
}
0 commit comments