Mercurial > hg > truffle
diff src/share/vm/classfile/systemDictionary.cpp @ 8667:1f9994892f89
8008549: NPG: SystemDictionary::find(...) unnecessarily keeps class loaders alive
Summary: SystemDictionary::find(...) should not create and register ClassLoaderData objects for class loaders.
Reviewed-by: coleenp, acorn
Contributed-by: Stefan Karlsson <stefan.karlsson@oracle.com>, Erik Helin <erik.helin@oracle.com>
author | stefank |
---|---|
date | Thu, 21 Feb 2013 17:22:15 +0100 |
parents | 8b46b0196eb0 |
children | 1fc4d4768b90 |
line wrap: on
line diff
--- a/src/share/vm/classfile/systemDictionary.cpp Tue Feb 26 14:09:52 2013 +0100 +++ b/src/share/vm/classfile/systemDictionary.cpp Thu Feb 21 17:22:15 2013 +0100 @@ -866,16 +866,22 @@ // the new entry. Klass* SystemDictionary::find(Symbol* class_name, - Handle class_loader, - Handle protection_domain, - TRAPS) { + Handle class_loader, + Handle protection_domain, + TRAPS) { // UseNewReflection // The result of this call should be consistent with the result // of the call to resolve_instance_class_or_null(). // See evaluation 6790209 and 4474172 for more details. class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); - ClassLoaderData* loader_data = register_loader(class_loader, CHECK_NULL); + ClassLoaderData* loader_data = ClassLoaderData::class_loader_data_or_null(class_loader()); + + if (loader_data == NULL) { + // If the ClassLoaderData has not been setup, + // then the class loader has no entries in the dictionary. + return NULL; + } unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data); int d_index = dictionary()->hash_to_index(d_hash);