RFR: 8310929: Optimization for Integer.toString [v20]

Quan Anh Mai qamai at openjdk.org
Wed Sep 6 16:58:43 UTC 2023


On Wed, 6 Sep 2023 16:51:51 GMT, 温绍锦 <duke at openjdk.org> wrote:

>> I'd be more comfortable replacing the use of Unsafe with either the ByteArray functions or VarHandles.
>> Using VarHandles will enable future optimizations, whereas Unsafe is a primitive tool and is brittle.
>
>> I'd be more comfortable replacing the use of Unsafe with either the ByteArray functions or VarHandles. Using VarHandles will enable future optimizations, whereas Unsafe is a primitive tool and is brittle.
> 
> I also agree that using VarHandler is better, but using VarHandler in StringLatin1 causes exception, as follows:
> 
> 
> final class StringLatin1 {
>     private static final VarHandle SHORT = MethodHandles.byteArrayViewVarHandle(short[].class, ByteOrder.LITTLE_ENDIAN);
> }
> 
> 
> 
> make images
> Building target 'images' in configuration 'macosx-aarch64-server-release'
> Compiling up to 3452 files for java.base
> Updating support/src.zip
> Updating images/sec-bin.zip
> Optimizing the exploded image
> Error occurred during initialization of VM
> java.lang.ExceptionInInitializerError
> 	at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2246)
> 	at java.lang.invoke.VarHandles.byteArrayViewHandle(java.base/VarHandles.java:258)
> 	at java.lang.invoke.MethodHandles.byteArrayViewVarHandle(java.base/MethodHandles.java:4553)
> 	at java.lang.StringLatin1.<clinit>(java.base/StringLatin1.java:84)
> 	at java.lang.String.equals(java.base/String.java:1863)
> 	at java.util.ImmutableCollections$Set12.<init>(java.base/ImmutableCollections.java:797)
> 	at java.util.Set.of(java.base/Set.java:487)
> 	at jdk.internal.reflect.Reflection.<clinit>(java.base/Reflection.java:58)
> 	at java.security.AccessController.doPrivileged(java.base/AccessController.java:319)
> 	at java.lang.reflect.AccessibleObject.<clinit>(java.base/AccessibleObject.java:524)
> Caused by: java.lang.NullPointerException
> 	at java.lang.invoke.MethodHandleStatics.<clinit>(java.base/MethodHandleStatics.java:70)
> 	at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2246)
> 	at java.lang.invoke.VarHandles.byteArrayViewHandle(java.base/VarHandles.java:258)
> 	at java.lang.invoke.MethodHandles.byteArrayViewVarHandle(java.base/MethodHandles.java:4553)
> 	at java.lang.StringLatin1.<clinit>(java.base/StringLatin1.java:84)
> 	at java.lang.String.equals(java.base/String.java:1863)
> 	at java.util.ImmutableCollections$Set12.<init>(java.base/ImmutableCollections.java:797)
> 	at java.util.Set.of(java.base/Set.java:487)
> 	at jdk.internal.reflect.Reflection.<clinit>(java.base/Reflection.java:58)
> 	at java.security.AccessController.doPrivileged(java.base/AccessController.java:319)
> 	at java.lang.reflect.AccessibleObject.<clinit>(java.base/AccessibleObject.java:524)

@wenshao You can use a holder class that will get initialized only when `StringLatin1::getChars` is called.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/14699#issuecomment-1708765640


More information about the core-libs-dev mailing list