RFR(XS) 8189140 - SystemDictionaryShared::initialize() should be renamed to be more meaningful

David Holmes david.holmes at oracle.com
Tue May 15 08:39:11 UTC 2018

Correcting silly comment ...

On 15/05/2018 6:31 PM, David Holmes wrote:
> On 15/05/2018 5:44 PM, Ioi Lam wrote:
>> On 5/14/18 11:25 PM, David Holmes wrote:
>>> Hi Ioi,
>>> On 15/05/2018 4:07 PM, Ioi Lam wrote:
>>>> https://bugs.openjdk.java.net/browse/JDK-8189140
>>>> http://cr.openjdk.java.net/~iklam/jdk11/8189140-rename-system-dict-shared-initialize.v01/ 
>>>> Summary:
>>>> 1. Removed the forced initialization of a few classes used by AppCDS 
>>>> at JVM start-up.
>>>>     Instead, initialize these class on demand by calling 
>>>> InstanceKlass::initialize, which
>>>>     is a quick no-op if the class is already initialized.
>>> Any reason not to just add them to the set of pre-loaded and 
>>> pre-initialized classes used with shared spaces in 
>>> initialize_preloaded_classes()?
>> Because initialize_preloaded_classes(), despite its name, doesn't 
>> actually call InstanceKlass::initialize(). It just resolves the 
>> klasses. If you try to call InstanceKlass::initialize() here, the VM 
>> would crash.
> So much from truth in advertising ;-)
>> A few classes are initialized inside functions like 
>> Threads::initialize_java_lang_classes(), which seems a bit like black 
>> magic to me, so I didn't want to muck with them.
> Yes - the initialization order is not something to be trifled with.
>>> Aside: It looks a little odd to lazy-init a couple of classes but 
>>> then assume/expect others (like SecureClassLoader) are already 
>>> initialized.
>> The explicit init is only necessary before calling 
>> InstanceKlass::allocate_instance_handle(), which, unlike the 'new' 
>> bytecodes, does not implicitly initialize the class.
> What is allocate_instance_handle() supposed to do? Is it just a raw 
> allocator? The class must be initialized before any constructor is called.
>> The other code in SystemDictionaryShared.cpp access the classes 
>> through JavaCalls::call_{static,special,virtual}, where the class 
>> would be initialized implicitly as necessary in exactly the same way 
>> as the invoke{static,special,virtual} bytecodes.
>> Perhaps we should add a JavaCalls::new_instance() method that 
>> implicitly initializes the class, just like the 'new' bytecode? Should 
>> I do that in this changeset?
> I'm not sure where you would do this or why you need to create an 
> instance of these classes ??

Of course you are creating instances of these classes. But you're using 
JavaCalls::call_special to invoke the constructor, so isn't that already 
ensuring the class is initialized as you just described ??


>>> But this seems functionally fine and a good tidy up (the class init 
>>> stuff really didn't belong as a side-effect). The only thing I'd be 
>>> double checking is that the same thread (presumably the main thread) 
>>> is guaranteed to be the one doing the initialization.
>> There's no such requirement on the threads. If another thread is 
>> already in the middle of initializing the class, the thread that class 
>> InstanceKlass::initialize() will just wait for the class 
>> initialization to complete.
> I was thinking purely from the perspective of not changing anything in 
> the initialization order - and making sure you can't inadvertently do 
> something on a thread that isn't allowed to load/initialize klasses. 
> This is intended to be a small code cleanup so I presumed you didn't 
> want to perturb things too much - ideally not at all.
> David
>> Thanks
>> - Ioi
>>> Thanks,
>>> David
>>>> 2. The only initialization left is that of a global lock. So I 
>>>> renamed the function
>>>>     to SystemDictionaryShared::initialize_locks().
>>>> 3. I moved the call of this function from 
>>>> SystemDictionary::compute_java_loaders() to
>>>> SystemDictionary::initialize() where it seems to fit.
>>>> Testing with hs-tiers 1 and 2.
>>>> Thanks
>>>> - Ioi

More information about the hotspot-runtime-dev mailing list