RFR(S) 8241071 Generation of classes.jsa is not deterministic

David Holmes david.holmes at oracle.com
Mon May 4 22:14:38 UTC 2020


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
>>>>
> 


More information about the core-libs-dev mailing list