--- old/src/share/vm/ci/ciInstanceKlass.hpp 2017-04-25 16:44:08.623176112 +0200 +++ new/src/share/vm/ci/ciInstanceKlass.hpp 2017-04-25 16:44:08.471176117 +0200 @@ -44,6 +44,7 @@ friend class ciField; private: + jobject _holder; jobject _loader; jobject _protection_domain; @@ -78,12 +79,18 @@ protected: ciInstanceKlass(Klass* k); - ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain); + ciInstanceKlass(ciSymbol* name, jobject holder, jobject loader, jobject protection_domain); InstanceKlass* get_instanceKlass() const { return InstanceKlass::cast(get_Klass()); } + // Hold metadata from unloading by keeping its holder alive. + // Though ciInstanceKlass records class loader oop, it's not enough to keep + // VM anonymous classes alive (loader == NULL). Klass holder should be used instead. + oop holder(); + jobject holder_handle(); + oop loader(); jobject loader_handle();