On Tue, 29 Jun 2021 19:23:26 GMT, Roger Riggs <rri...@openjdk.org> wrote:

>> src/java.base/share/classes/java/lang/System.java line 337:
>> 
>>> 335:             = Collections.synchronizedMap(new WeakHashMap<>());
>>> 336:     }
>>> 337: 
>> 
>> I wonder about the use of a WeakHashMap here. That may work well when the 
>> source is an interned string (a class name) which will be strongly 
>> referenced elsewhere and may be garbage collected if the class is unloaded, 
>> but in the case where it contains the name of the source jar then that 
>> string will only be referenced by the weak hashmap, and therefore it could 
>> be garbage collected any time - which would cause the mapping to be removed. 
>> In that case you cannot guarantee that the warning will be emitted only once.
>
> Using a HashSet<Class> could use the callerClass as the key and be a stable 
> reference for having given the message.
> or use a ConcurrentHashMap<Class<?>>, boolean> and avoid any separate 
> synchronization that would be needed with a HashSet or HashMap.

If I switch to a "non-weak" set or map, then it seems I can safely use the 
source string as the key. Will using the Class object as a key prevent them 
from unloading?

-------------

PR: https://git.openjdk.java.net/jdk17/pull/166

Reply via email to