RFR: 8338526: Don't store abstract and interface Klasses in class metaspace

Chen Liang liach at openjdk.org
Wed Aug 21 21:05:04 UTC 2024


On Wed, 21 Aug 2024 20:31:09 GMT, Dean Long <dlong at openjdk.org> wrote:

>> This change stores InstanceKlass for interface and abstract classes in the non-class metaspace, since class metaspace will have limits on number of classes that can be represented when Lilliput changes go in.  Classes that have no instances created for them don't require compressed class pointers.  The generated LambdaForm classes are also AllStatic, and changing them to abstract moves them to non-class metaspace too.  It's not technically great to make them abstract and not final but you can't have both.  Java classfile access flags have no way of specifying something like AllStatic.
>> 
>> Tested with tier1-8.
>
> src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java line 279:
> 
>> 277:         clb.withMethod(invokerName, invokerDesc, ACC_STATIC, config);
>> 278:     }
>> 279: 
> 
> There's probably not much value in using ACC_FINAL here anyway.  We are only using these classes to create static methods, right?  I think ACC_INTERFACE would work here too.

Note that JVMS 4.1 requires `ACC_ABSTRACT` to be also set when `ACC_INTERFACE` is set. Also note that some classes capture class data to refer to hidden classes and method handles or lambda forms, so those fields' generation need to add `ACC_PUBLIC` flag to be usable in interfaces.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/19157#discussion_r1725751901


More information about the core-libs-dev mailing list