On Tue, 28 Feb 2023 09:05:44 GMT, John Hendrikx <[email protected]> wrote:
>> src/java.base/share/classes/java/lang/AbstractStringBuilder.java line 1903:
>>
>>> 1901: throw new OutOfMemoryError("Required length exceeds
>>> implementation limit");
>>> 1902: }
>>> 1903: int total = count * length;
>>
>> We may avoid division if we use the long type:
>>
>>
>> long totalLong = ((long) count) * length;
>> if (totalLong > Integer.MAX_VALUE - offset) {
>> throw new OutOfMemoryError("Required length exceeds implementation
>> limit");
>> }
>> int total = (int) totalLong;
>>
>>
>> Should be faster.
>
> I'm a bit surprised this (and the original code) is throwing
> `OutOfMemoryError` when running into the max array size. It is not truly an
> out of memory error, but being an `Error`, it would evade standard catch
> `Exception` blocks. I would think this is more of an `IllegalStateException`
> or perhaps something array specific.
>
> `OutOfMemoryError` is documented pretty specifically that an object
> allocation failed after exhaustive GC, but no allocation or GC happened:
>
>>Thrown when the Java Virtual Machine cannot allocate an object because it is
>>out of memory, and no more memory could be made available by the garbage
>>collector.
>
> ... which is not happening here at all. This leads me to believe the error is
> not used correctly here.
>
> Other reasons I find it surprising: `StringBuilder` is not documented to
> throw this anywhere, it seems to just leak through from various methods
> implemented by `AbstractStringBuilder`.
OOME is used for a number of not-strictly out of memory conditions, for example
off-heap allocation and allocations that can't succeed because they exceed
implementation limits.
-------------
PR: https://git.openjdk.org/jdk/pull/12728