This error has two causes. The first cause is that the VM cannot allocate arrays whose length exceeds Integer.MAX_VALUE - 8 (MAX_ARRAY_SIZE). The second cause is that Arrays.deepToString tries to pre-allocate 20 chars per string representation for each array element and maxes out at Integer.MAX_VALUE, which is above MAX_ARRAY_SIZE. One solution would be to change Arrays.deepToString to max out at MAX_ARRAY_SIZE.
Separately, java.lang.AbstractStringBuilder#MAX_ARRAY_SIZE seems unused; I wonder how that happened. -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