Skip to content

OpenJDK CompactString/MaxSizeUTF16String testMaxCharArray() expects OOM but gets NegativeArraySizeException with JIT #19309

Closed
@pshipton

Description

@pshipton

jdk23 testing on amac. This also occurs with jdk-21.0.2+13 or jdk-17.0.10+7 on xLinux. It does not occur with jdk-17.0.9+9 so likely there is a change between 0.41 and 0.43 causing this.

17:09:02  openjdk version "23-internal" 2024-09-17
17:09:02  OpenJDK Runtime Environment (build 23-internal-adhoc.****.BuildJDKnextaarch64macPersonal)
17:09:02  Eclipse OpenJ9 VM (build master-b2db2045aa4, JRE 23 Mac OS X aarch64-64-Bit 20240411_113 (JIT enabled, AOT enabled)
17:09:02  OpenJ9   - b2db2045aa4
17:09:02  OMR      - 0e07ad19c1f
17:09:02  JCL      - 7ac6a9b5b39 based on jdk-23+17)

From a grinder on
java/lang/String/CompactString/MaxSizeUTF16String.java

16:22:49  STARTED    MaxSizeUTF16String::testMaxCharArray 'testMaxCharArray()'
16:22:49  Checking max UTF16 string len: 1073741824
16:22:49  java.lang.NegativeArraySizeException: -2147483648
16:22:49  	at java.base/java.lang.String.<init>(String.java:5655)
16:22:49  	at java.base/java.lang.String.<init>(String.java:489)
16:22:49  	at MaxSizeUTF16String.testMaxCharArray(MaxSizeUTF16String.java:110)

This can be duplicated with the following, when running with -Xjit:count=0. When running without or with -Xint, the expected OOM error occurs (shown below).

public class MaxChar {

private final static int MAX_UTF16_STRING_LENGTH = Integer.MAX_VALUE / 2;

    private static char[] generateCharData(int size) {
        char[] nonAscii = "\u0100".toCharArray();
        char[] arr = new char[size];
        System.arraycopy(nonAscii, 0, arr, 0, nonAscii.length); // non-latin1 at start
        return arr;
    }

public static void main(String[] args) throws Throwable {
        final char[] large_char_array = generateCharData(MAX_UTF16_STRING_LENGTH + 1);
        new String(large_char_array, 0, MAX_UTF16_STRING_LENGTH + 1);
}
}
Exception in thread "main" java.lang.OutOfMemoryError: UTF16 String size is 1073741824, should be less than 1073741823
        at java.base/java.lang.StringUTF16.newBytesLength(StringUTF16.java:60)
        at java.base/java.lang.StringUTF16.newBytesFor(StringUTF16.java:50)
        at java.base/java.lang.StringUTF16.toBytes(StringUTF16.java:169)
        at java.base/java.lang.StringUTF16.compress(StringUTF16.java:218)
        at java.base/java.lang.String.<init>(String.java:5646)
        at java.base/java.lang.String.<init>(String.java:489)
        at MaxChar.main(MaxChar.java:14)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions