Created PR to remove AbstractStringBuilder.MAX_ARRAY_SIZE -
https://github.com/openjdk/jdk/pull/5878

BTW, I found one more place where Integer.MAX_VALUE is used as maximum
array length - 
java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue#grow
I think this method could be reworked to take advantage of
ArraysSupport.newLength method too.


Andrey Turbanov

сб, 9 окт. 2021 г. в 20:09, Pavel Rappo <pavel.ra...@oracle.com>:
>
>
>
> > On 9 Oct 2021, at 13:07, Pavel Rappo <pavel.ra...@oracle.com> wrote:
> >
> > <snip>
> >
> > Separately, java.lang.AbstractStringBuilder#MAX_ARRAY_SIZE seems unused; I 
> > wonder how that happened.
>
> I found what happened:
>
> $ git log -S "MAX_ARRAY_SIZE" -- 
> src/java.base/share/classes/java/lang/AbstractStringBuilder.java
> commit 03642a01af7123298d6524a98c99a3934d35c11b
> Author: Jim Laskey <jlas...@openjdk.org>
> Date:   Thu Jun 11 10:08:23 2020 -0300
>
>     8230744: Several classes throw OutOfMemoryError without message
>
>     Reviewed-by: psandoz, martin, bchristi, rriggs, smarks
>
> Looking at the corresponding review thread, 
> https://mail.openjdk.java.net/pipermail/core-libs-dev/2020-June/066874.html, 
> the question about "the local orphan" MAX_ARRAY_SIZE was raised by Martin and 
> subsequently addressed by Jim. The problem is, there were two of these 
> fields. The one in PriorityBlockingQueue was spotted and deleted, the one in 
> AbstractStringBuilder was not.
>
> Andrey, regardless of the outcome of your main question (OOM from 
> Arrays.deepToString), would be willing to publish a PR to delete that field 
> in AbstractStringBuilder?
>
> -Pavel
>
> >
> > -Pavel
> >
> >> On 9 Oct 2021, at 11:38, Andrey Turbanov <turban...@gmail.com> wrote:
> >>
> >> Hello.
> >> I came across unexpected behaviour of Arrays.deepToString method.
> >> It throws OOM even on non-huge arrays.
> >> For example this code:
> >>
> >>   int size = Integer.MAX_VALUE / 19;
> >>   Integer[] integers = new Integer[size];
> >>   Arrays.fill(integers, 0);
> >>  System.out.println(Arrays.deepToString(integers));
> >>
> >> Fails with following stack trace:
> >>
> >> Exception in thread "main" java.lang.OutOfMemoryError: Requested array
> >> size exceeds VM limit
> >>   at 
> >> java.base/java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:86)
> >>   at java.base/java.lang.StringBuilder.<init>(StringBuilder.java:112)
> >>   at java.base/java.util.Arrays.deepToString(Arrays.java:5160)
> >>
> >>
> >> I believe it should be able to handle such arrays and not throw OOM
> >>
> >>
> >> Andrey Turbanov
> >
>

Reply via email to