Hi Ioi,

On 5/05/2020 3:43 am, Ioi Lam wrote:


On 4/27/20 7:05 PM, David Holmes wrote:
On 28/04/2020 10:01 am, David Holmes wrote:
On 28/04/2020 9:37 am, Ioi Lam wrote:
Hi David & Jiangli,

Thanks for your comments.

I thought about using a system property, but the user can also specify it like

     java -Djdk.xshare.dump.salt=0 MyProgram

There's a way to pass properties from the VM that the user can't override. I'll need to lookup the details.

It should suffice to define SystemProperty that is non-writeable and internal (for good measure). But it seems we have introduced a bug since Java 9 whereby a non-writeable property is actually being overwritten! :(

David


Hi David,

I tried implementing the seed as a system property. However, ImmutableCollections.<clinit>() is executed very early during JDK bootstrap (about 500-th bytecode), much earlier than when System.props is initialized (about 43689-th bytecode). So attempts to read the system property would give a NullPointerException

Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
    at java.util.ImmutableCollections$Set12.<init>(java.base/ImmutableCollections.java:626)
     at java.util.Set.of(java.base/Set.java:468)
     at java.lang.Module.<clinit>(java.base/Module.java:251)
Caused by: java.lang.NullPointerException
     at java.lang.System.getProperty(java.base/System.java:834)
    at java.util.ImmutableCollections.<clinit>(java.base/ImmutableCollections.java:80)     at java.util.ImmutableCollections$Set12.<init>(java.base/ImmutableCollections.java:626)
     at java.util.Set.of(java.base/Set.java:468)
     at java.lang.Module.<clinit>(java.base/Module.java:251)

Because of this, I have to keep using the JVM_GetRandomSeedForCDSDump() native function.

Okay - thanks for trying the alternative. Initialization is always tricky.

David

Thanks
- Ioi

David

This would circumvent the calculation of ImmutableCollections.SALT32L for normal execution. I am not sure if this is desirable, or if there's a way to prevent the user from doing that. I'll see what the core lib folks suggest.

Updated webrev:
http://cr.openjdk.java.net/~iklam/jdk15/8241071-deterministic-cds-archive.v03/ http://cr.openjdk.java.net/~iklam/jdk15/8241071-deterministic-cds-archive.v03.delta/

More comments below


On 4/26/20 11:20 PM, David Holmes wrote:
Hi Ioi,

On 27/04/2020 3:22 pm, Ioi Lam wrote:
https://bugs.openjdk.java.net/browse/JDK-8241071
http://cr.openjdk.java.net/~iklam/jdk15/8241071-deterministic-cds-archive.v02/

The goal is to for "java -Xshare:dump" to produce deterministic contents in the CDS archive that depend only on the contents of $JAVA_HOME/lib/modules.

Problems:
[1] Symbols in the CDS archive may have non-deterministic order because
     Arena allocation is non-deterministic.
[2] The contents of the CDS shared heap region may be randomized due to
     ImmutableCollections.SALT32L.

Fixes:
[1] With -Xshare:dump, allocate Symbols from the class space (64-bit only).

I'm not seeing what restricts this to 64-bit only ??

The last version of the patch allocated using MetaspaceObj::ClassType. On 64-bit+compressed classes, this will allocate from the class space.

But anyway, as Thomas commented, doing this is problematic.


Will changing the allocation of symbols cause any problems with the amount of "class space" we need?


Per Thomas's comment, I moved the allocation of Symbols in a separate virtual space. Please see my comments to Thomas's e-mail.

     See changes in symbol.cpp for details.
[2] When running the VM with -Xshare:dump, ImmutableCollections.SALT32L is      initialized with a deterministic seed. NOTE: this affects ONLY when the      VM is running with the special flag -Xshare:dump to dump the CDS archive.
     It does NOT affect normal execution of Java programs.

I can't say I like adding in the VM call for this. Another alternative would be a VM defined system property. But I'll let core-libs folk make the call here.

---
I also cleaned up the -Xlog:cds output and print out the CRC of each
CDS region, to help diagnose why two CDS archives may have different contents.

Generally seems okay. A couple of minor nits:

src/hotspot/share/oops/symbol.cpp

typo: adresses -> addresses


Fixed

test/hotspot/jtreg/runtime/cds/DeterministicDump.java

Should the test use @driver mode?


Fixed

 39 // use of SharedArchiveFile argument.

s/argument/arguments/

 40 // methods to form command line to create/use shared archive.

s/line/lines/

s/shared/the shared/


I copied these comments from another test. They are not needed here so I deleted them in the new webrev.

 71 if (n0 == 0) {

Shouldn't this check come before the loop at line 63?

Fixed.


Thanks
- Ioi

Thanks,
David
-----

Thanks
- Ioi


Reply via email to