--- old/src/hotspot/share/classfile/classLoaderData.cpp 2019-03-11 14:25:36.550355565 +0100 +++ new/src/hotspot/share/classfile/classLoaderData.cpp 2019-03-11 14:25:36.350355567 +0100 @@ -63,6 +63,7 @@ #include "oops/access.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/oopHandle.inline.hpp" +#include "oops/valueKlass.hpp" #include "oops/weakHandle.inline.hpp" #include "runtime/atomic.hpp" #include "runtime/handles.inline.hpp" @@ -363,6 +364,16 @@ } } +void ClassLoaderData::value_classes_do(void f(ValueKlass*)) { + // Lock-free access requires load_acquire + for (Klass* k = OrderAccess::load_acquire(&_klasses); k != NULL; k = k->next_link()) { + if (k->is_value()) { + f(ValueKlass::cast(k)); + } + assert(k != k->next_link(), "no loops!"); + } +} + void ClassLoaderData::modules_do(void f(ModuleEntry*)) { assert_locked_or_safepoint(Module_lock); if (_unnamed_module != NULL) { @@ -529,6 +540,8 @@ // if they are not already on the _klasses list. free_deallocate_list_C_heap_structures(); + value_classes_do(ValueKlass::cleanup); + // Clean up class dependencies and tell serviceability tools // these classes are unloading. Must be called // after erroneous classes are released. @@ -823,7 +836,11 @@ } else if (m->is_constantPool()) { MetadataFactory::free_metadata(this, (ConstantPool*)m); } else if (m->is_klass()) { - MetadataFactory::free_metadata(this, (InstanceKlass*)m); + if (!((Klass*)m)->is_value()) { + MetadataFactory::free_metadata(this, (InstanceKlass*)m); + } else { + MetadataFactory::free_metadata(this, (ValueKlass*)m); + } } else { ShouldNotReachHere(); }