On Thu, 24 Apr 2025 21:01:11 GMT, Erik Österlund <[email protected]> wrote:
>> src/java.base/share/classes/jdk/internal/util/ReferencedKeyMap.java line 355:
>>
>>> 353: if (referent == null) {
>>> 354: // We don't need this key anymore. Add to stale queue
>>> 355: ((Reference)key).enqueue();
>>
>> Is enqueue necessary here? Afaik this map only uses the queue to be alert of
>> member reference being garbage collected and then remove stale elements.
>> Since at this stage this map is no longer used, maybe `key.unused()` is
>> sufficient?
>
> I'm not sure what you are proposing. But enqueue is used to ensure that
> inactive references are pruned from the data structure so that dumping only
> includes active references. This way, the JVM that loads these objects create
> these references as active and hence follow the usual life cycle that every
> other reference does. I want to avoid having a new "special" life cycles for
> dumped references.
The map is still being used (and will be stored into the AOT cache). The key no
longer has a referent, so we need to remove the key from the map. Adding the
key to the stale queue and calling `removeStaleReferences()` will accomplish
this. `key.unused()` does not remove the key from the map.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24757#discussion_r2059235560