RFR: 8343019: Primitive caches must use boxed instances from the archive [v5]

Jiangli Zhou jiangli at openjdk.org
Thu Oct 31 15:40:35 UTC 2024


On Thu, 31 Oct 2024 07:32:01 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

>> The runtime cache would only store the additional boxed Integers not in the archived cache, without affecting the archived boxed Integers. Something like the following would work (I didn't test all corner cases):
>> 
>> 
>>             static final int archivedSize;
>>             ...
>>             archivedSize = archivedCache == null ? 0 : archivedCache.length;
>>             if (archivedCache == null || size > archivedCache.length) {
>>                 int runtimeCacheSize = size - archivedSize;
>>                 Integer[] c = new Integer[runtimeCacheSize];
>>                 int j = low + archivedSize;
>>                 for(int i = 0; i < runtimeCacheSize; i++) {
>>                     c[i] = new Integer(j++);
>>                 }
>> 
>>                 cache = c;
>>                 if (archivedCache == null) {
>>                     archivedCache = c;
>>                 }
>>             } else {
>>                 cache = null;
>>             }
>> 
>> 
>> `Integer.valueOf()` would retrieve the cached boxed Integer either from the archived cache or the runtime created cache, if the value is within the runtime [low, high].
>> 
>> 
>>     public static Integer valueOf(int i) {
>>         if (i >= IntegerCache.low && i <= IntegerCache.high) {
>>             int index = i + (-IntegerCache.low);
>>             if (IntegerCache.archivedSize != 0 && IntegerCache.archivedSize >= index) {
>>                 return IntegerCache.archivedCache[index];
>>             } else {
>>                 return IntegerCache.cache[index - IntegerCache.archivedSize];
>>             }      
>>         }
>>         return new Integer(i); 
>>     }
>
> Ah, I see. I don't think we want to do this, though. I vaguely remember `Integer.valueOf` code shape being important for things like C2 optimizations around EA and autoboxing elimination. The beauty of staying within a single array is avoiding a whole class of these issues.

I think it's mostly ok if we don't take the archivedCache+runtimeCache approach. The overhead is not too large in common cases, as likely the archivedCache would have the default size if runtime changes to use a different `high` value.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/21737#discussion_r1824689846


More information about the core-libs-dev mailing list