@@ -249,19 +249,23 @@ private static void cleanUpGlobalClassValue(@NonNull ClassLoader loader) throws
249249 toRemove .add ((Class ) klazzF .get (value ));
250250 }
251251 }
252- Iterator <Class <?>> it = toRemove .iterator ();
253- while (it .hasNext ()) {
254- Class <?> klazz = it .next ();
252+ boolean isLogLevelFinestLoggable = LOGGER .isLoggable (Level .FINEST );
253+ if (isLogLevelFinestLoggable ) {
254+ LOGGER .log (Level .FINE , "The log level FINEST is loggable, cleanUpGlobalClassValue will be slow, toRemove.size()={0}" , toRemove .size ());
255+ }
256+ List <Class <?>> toRemoveReally = new ArrayList <>();
257+ for (Class <?> klazz : toRemove ) {
255258 ClassLoader encounteredLoader = klazz .getClassLoader ();
256259 if (encounteredLoader != loader ) {
257- it .remove ();
258- if (LOGGER .isLoggable (Level .FINEST )) {
259- LOGGER .log (Level .FINEST , "ignoring {0} with loader {1}" , new Object [] {klazz , /* do not hold from LogRecord */ String .valueOf (encounteredLoader )});
260+ if (isLogLevelFinestLoggable ) {
261+ LOGGER .log (Level .FINEST , "ignoring {0} with loader {1}" , new Object []{klazz , /* do not hold from LogRecord */ String .valueOf (encounteredLoader )});
260262 }
263+ } else {
264+ toRemoveReally .add (klazz );
261265 }
262266 }
263- LOGGER .log (Level .FINE , "cleaning up {0} associated with {1}" , new Object [] {toRemove .toString (), loader .toString ()});
264- for (Class <?> klazz : toRemove ) {
267+ LOGGER .log (Level .FINE , "cleaning up {0} associated with {1}" , new Object [] {toRemoveReally .toString (), loader .toString ()});
268+ for (Class <?> klazz : toRemoveReally ) {
265269 removeM .invoke (map , klazz );
266270 }
267271 }
0 commit comments