< prev index next >
src/share/vm/classfile/systemDictionary.cpp
Print this page
rev 12604 : 8173743: Failures during class definition can lead to memory leaks in metaspace
Reviewed-by: dholmes, coleenp, acorn, ddmitriev
*** 1150,1174 ****
assert(k.not_null(), "no klass created");
Symbol* h_name = k->name();
assert(class_name == NULL || class_name == h_name, "name mismatch");
- bool define_succeeded = false;
// Add class just loaded
// If a class loader supports parallel classloading handle parallel define requests
// find_or_define_instance_class may return a different InstanceKlass
if (is_parallelCapable(class_loader)) {
! instanceKlassHandle defined_k = find_or_define_instance_class(h_name, class_loader, k, CHECK_NULL);
! if (k() == defined_k()) {
! // we have won over other concurrent threads (if any) that are
! // competing to define the same class.
! define_succeeded = true;
! }
k = defined_k;
} else {
! define_instance_class(k, CHECK_NULL);
! define_succeeded = true;
}
// Make sure we have an entry in the SystemDictionary on success
debug_only( {
MutexLocker mu(SystemDictionary_lock, THREAD);
--- 1150,1178 ----
assert(k.not_null(), "no klass created");
Symbol* h_name = k->name();
assert(class_name == NULL || class_name == h_name, "name mismatch");
// Add class just loaded
// If a class loader supports parallel classloading handle parallel define requests
// find_or_define_instance_class may return a different InstanceKlass
if (is_parallelCapable(class_loader)) {
! instanceKlassHandle defined_k = find_or_define_instance_class(h_name, class_loader, k, THREAD);
! if (defined_k.not_null() && defined_k() != k()) {
! // If a parallel capable class loader already defined this class, register 'k' for cleanup.
! loader_data->add_to_deallocate_list(k());
k = defined_k;
+ }
} else {
! define_instance_class(k, THREAD);
! }
!
! // If defining the class throws an exception register 'k' for cleanup.
! if (HAS_PENDING_EXCEPTION) {
! assert(k.not_null(), "Must have an instance klass here!");
! loader_data->add_to_deallocate_list(k());
! return NULL;
}
// Make sure we have an entry in the SystemDictionary on success
debug_only( {
MutexLocker mu(SystemDictionary_lock, THREAD);
< prev index next >