> **Background:**
>
> In the Java Language, Enums can be tested for equality, so the constants in
> an Enum type must be unique. Javac compiles an enum declaration like this:
>
>
> public enum Day { SUNDAY, MONDAY ... }
>
>
> to
>
>
> public class Day extends java.lang.Enum {
> public static final SUNDAY = new Day("SUNDAY");
> public static final MONDAY = new Day("MONDAY"); ...
> }
>
>
> With CDS archived heap objects, `Day::<clinit>` is executed twice: once
> during `java -Xshare:dump`, and once during normal JVM execution. If the
> archived heap objects references one of the Enum constants created at dump
> time, we will violate the uniqueness requirements of the Enum constants at
> runtime. See the test case in the description of
> [JDK-8275731](https://bugs.openjdk.java.net/browse/JDK-8275731)
>
> **Fix:**
>
> During -Xshare:dump, if we discovered that an Enum constant of type X is
> archived, we archive all constants of type X. At Runtime, type X will skip
> the normal execution of `X::<clinit>`. Instead, we run
> `HeapShared::initialize_enum_klass()` to retrieve all the constants of X that
> were saved at dump time.
>
> This is safe as we know that `X::<clinit>` has no observable side effect --
> it only creates the constants of type X, as well as the synthetic value
> `X::$VALUES`, which cannot be observed until X is fully initialized.
>
> **Verification:**
>
> To avoid future problems, I added a new tool, CDSHeapVerifier, to look for
> similar problems where the archived heap objects reference a static field
> that may be recreated at runtime. There are some manual steps involved, but I
> analyzed the potential problems found by the tool are they are all safe
> (after the current bug is fixed). See cdsHeapVerifier.cpp for gory details.
> An example trace of this tool can be found at
> https://bugs.openjdk.java.net/secure/attachment/97242/enum_warning.txt
>
> **Testing:**
>
> Passed Oracle CI tiers 1-4. WIll run tier 5 as well.
Ioi Lam has updated the pull request with a new target base due to a merge or a
rebase. The pull request now contains 10 commits:
- fixed copyright year
- Merge branch 'master' into 8275731-heapshared-enum
- fixed whitespace
- Fixed comments per @calvinccheung review
- Merge branch 'master' into 8275731-heapshared-enum
- Use InstanceKlass::do_local_static_fields for some field iterations
- Merge branch 'master' into 8275731-heapshared-enum
- added exclusions needed by "java -Xshare:dump -ea -esa"
- Comments from @calvinccheung off-line
- 8275731: CDS archived enums objects are recreated at runtime
-------------
Changes: https://git.openjdk.java.net/jdk/pull/6653/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=6653&range=06
Stats: 860 lines in 16 files changed: 807 ins; 4 del; 49 mod
Patch: https://git.openjdk.java.net/jdk/pull/6653.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/6653/head:pull/6653
PR: https://git.openjdk.java.net/jdk/pull/6653