RFR(L): 8186842: Use Java class loaders for creating the CDS archive
Ioi Lam
ioi.lam at oracle.com
Tue Aug 29 20:44:13 UTC 2017
On 8/29/17 12:55 PM, Jiangli Zhou wrote:
> I was looking for code that handles anonymous classes. There are following code in classLoader.cpp and metaspaceShared.cpp. However, I can’t find any code that specifically removes anonymous classes from the system dictionary at CDS dump time. I’m probably missing something, how do we guarantee (besides the assert) anonymous classes are not being archived?
>
> 1582 void ClassLoader::record_shared_class_loader_type(InstanceKlass* ik, const ClassFileStream* stream) {
> 1583 assert(DumpSharedSpaces, "sanity");
> 1584 assert(stream != NULL, "sanity");
> 1585
> 1586 if (ik->is_anonymous()) {
> 1587 // We do not archive anonymous classes.
> 1588 return;
> 1589 }
> 487 NOT_PRODUCT(
> 488 static void assert_not_anonymous_class(InstanceKlass* k) {
> 489 if (k->is_instance_klass()) {
> 490 assert(!(k->is_anonymous()), "cannot archive anonymous classes");
> 491 }
> 492 }
> 494 static void assert_no_anonymoys_classes_in_dictionaries() {
> 495 ClassLoaderDataGraph::dictionary_classes_do(assert_not_anonymous_class);
> 496 })
Hi Jiangli,
Anonymous classes are not stored inside any Dictionaries. They are
created by SystemDictionary::parse_stream() with a non-null host_klass:
// Note: this method is much like resolve_from_stream, but
// does not publish the classes via the SystemDictionary.
// Handles unsafe_DefineAnonymousClass and redefineclasses
// RedefinedClasses do not add to the class hierarchy
InstanceKlass* SystemDictionary::parse_stream(Symbol* class_name,
Handle class_loader,
Handle protection_domain,
ClassFileStream* st,
const InstanceKlass*
host_klass,
GrowableArray<Handle>* cp_patches,
TRAPS)
Anonymous classes are referenced in other data structures, such as in
this loader_data:
loader_data =
ClassLoaderData::anonymous_class_loader_data(class_loader(), CHECK_NULL);
However, all these places are ignored by CDS during dump time (We only
archive classes that are directly stored in the Dictionary objects of
the boot/platform/app loaders. See
SystemDictionary::combine_shared_dictionaries() in the new code).
Therefore, we can guarantee that no anonymous classes are archived. The
assert_no_anonymous_classes_in_dictionaries() just ensure this is true
(i.e., in future VM development, if people start putting anonymous
classes in the Dictionary objects of the boot/platform/app loaders, this
assert would catch it).
Thanks
- Ioi
More information about the hotspot-runtime-dev
mailing list