RFR(XS) 8189140 - SystemDictionaryShared::initialize() should be renamed to be more meaningful
David Holmes
david.holmes at oracle.com
Tue May 15 08:31:56 UTC 2018
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 ??
>> 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