< 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 >