RFR: 8309622: Re-examine the cache mechanism in BaseLocale [v5]
Chen Liang
liach at openjdk.org
Wed Aug 30 06:44:27 UTC 2023
On Tue, 1 Aug 2023 20:21:11 GMT, Naoto Sato <naoto at openjdk.org> wrote:
>> This is stemming from the PR: https://github.com/openjdk/jdk/pull/14211 where aggressive GC can cause NPE in `BaseLocale$Key` class. I refactored the in-house cache with WeakHashMap, and removed the Key class as it is no longer needed (thus the original NPE will no longer be possible). Also with the new JMH test case, it gains some performance improvement:
>>
>> (w/o fix)
>>
>> Benchmark Mode Cnt Score Error Units
>> LocaleCache.testForLanguageTag avgt 20 5781.275 ± 569.580 ns/op
>> LocaleCache.testLocaleOf avgt 20 62564.079 ± 406.697 ns/op
>>
>> (w/ fix)
>> Benchmark Mode Cnt Score Error Units
>> LocaleCache.testForLanguageTag avgt 20 4801.175 ± 371.830 ns/op
>> LocaleCache.testLocaleOf avgt 20 60394.652 ± 352.471 ns/op
>
> Naoto Sato has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 29 commits:
>
> - Merge branch 'master' of https://git.openjdk.org/jdk into JDK-8309622-Cache-BaseLocale
> - small cleanup
> - Merge branch 'pull/14684' into JDK-8309622-Cache-BaseLocale
> - Update ReferencedKeyTest.java
> - Simple versions of create
> - Add flag for reference queue type
> - Merge branch 'master' into 8310913
> - Update to use VirtualThread friendly stale queue.
> - Merge branch 'pull/14684' into JDK-8309622-Cache-BaseLocale
> - Remove warning tied to String Templates
> - ... and 19 more: https://git.openjdk.org/jdk/compare/7ba8c69a...0e435898
src/java.base/share/classes/sun/util/locale/BaseLocale.java line 96:
> 94:
> 95: // Non-normalized to normalized BaseLocale cache for saving costly normalizations
> 96: private static final Map<BaseLocale, BaseLocale> CACHE = ReferencedKeyMap.create(true, ConcurrentHashMap::new);
You can now simply use a `ReferencedKeySet<BaseLocale>` and call [`intern(T, UnaryOperator<T>)`](https://github.com/openjdk/jdk/blob/ce2a7ea40a22c652e5f8559c91d5eea197e2d708/src/java.base/share/classes/jdk/internal/util/ReferencedKeySet.java#L202) to cache a normalized variety computed from a non-normalized base.
test/jdk/jdk/internal/util/ReferencedKeyTest.java line 1:
> 1: /*
Is the test removal intentional?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/14404#discussion_r1309756538
PR Review Comment: https://git.openjdk.org/jdk/pull/14404#discussion_r1309757683
More information about the hotspot-gc-dev
mailing list