Closed
Description
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)