On Thu, 31 Oct 2024 07:32:01 GMT, Aleksey Shipilev <sh...@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

Reply via email to