JDK-8275509: (jlink) SystemModulesPlugin generates a jdk.internal.module.SystemModules$all.class which isn't reproducible
Ioi Lam
ioi.lam at oracle.com
Thu Oct 21 16:29:12 UTC 2021
On 10/21/21 5:25 AM, Alan Bateman wrote:
> On 21/10/2021 10:49, Jaikiran Pai wrote:
>> :
>>
>> Digging into it, it appears that since the ModuleDescriptor#equals()
>> calls equals() on enum types (in this specific case on
>> ModuleDescriptor.Requires.Modifier) and since enum type equality is
>> implemented as identity checks, those identity checks are
>> surprisingly failing. More specifically
>> ModuleDescriptor.Requires.Modifier.MANDATED ==
>> ModuleDescriptor.Requires.Modifier.MANDATED is equating to false
>> because at runtime I see that two different instances of
>> ModuleDescriptor.Requires.Modifier.MANDATED have been loaded (by the
>> same boot module classloader). Although I use
>> ModuleDescriptor.Requires.Modifier.MANDATED as an example, the same
>> is reproducible with other enum values like
>> ModuleDescriptor.Requires.Modifier.TRANSITIVE.
>>
>> This appears to be specific to CDS since running the above program with:
>>
>> java -Xshare:off EnumEquality
>>
>> succeeds and the ModuleDescriptor equality check passes.
>>
>> In short, it looks like there is some general issue with CDS and
>> equality checks with enums and perhaps deserves a separate JBS issue?
> I've asked Ioi Lam to comment on this, off-hand I'm not aware of any
> issues with CDS here but it may be related to the archiving of object
> graphs.
>
> -Alan
Hi Jaikiran and Alan,
Thanks for reporting this issue. It's a bug in CDS. I have filed
https://bugs.openjdk.java.net/browse/JDK-8275731 and am working on a fix.
This is my initial analysis of the problem.
====>>> Can anyone think of similar problems that may happen elsewhere?
The static constructors of enum classes are executed at both CDS dump
time and run time. E.g.,
public enum Modifier {
OPEN
}
The <clinit> method essentially does this:
public static final Modifier OPEN = new Modifier("OPEN");
If a reference of Modifier.OPEN is stored inside the CDS archived heap
during dump time, it will be different than the value of Modifier.OPEN
that is re-created at runtime by the execution of Modifier.<clinit>
Thanks
- Ioi
More information about the core-libs-dev
mailing list