< prev index next >
src/hotspot/share/ci/ciInstanceKlass.cpp
Print this page
*** 32,48 ****
--- 32,72 ----
#include "memory/allocation.inline.hpp"
#include "memory/resourceArea.hpp"
#include "oops/oop.inline.hpp"
#include "oops/fieldStreams.hpp"
#include "runtime/fieldDescriptor.hpp"
+ #if INCLUDE_ALL_GCS
+ # include "gc/g1/g1SATBCardTableModRefBS.hpp"
+ #endif
// ciInstanceKlass
//
// This class represents a Klass* in the HotSpot virtual machine
// whose Klass part in an InstanceKlass.
// ------------------------------------------------------------------
+ // ensure_metadata_alive
+ //
+ // Ensure that the metadata wrapped by the ciMetadata is kept alive by GC.
+ // This is primarily useful for metadata which is considered as weak roots
+ // by the GC but need to be strong roots if reachable from a current compilation.
+ // InstanceKlass are created for both weak and strong metadata. Ensuring this metadata
+ // alive covers the cases where there are weak roots without performance cost.
+ //
+ static void ensure_metadata_alive(oop metadata_holder) {
+ #if INCLUDE_ALL_GCS
+ if (!UseG1GC) {
+ return;
+ }
+ if (metadata_holder != NULL) {
+ G1SATBCardTableModRefBS::enqueue(metadata_holder);
+ }
+ #endif
+ }
+
+
+ // ------------------------------------------------------------------
// ciInstanceKlass::ciInstanceKlass
//
// Loaded instance klass.
ciInstanceKlass::ciInstanceKlass(Klass* k) :
ciKlass(k)
*** 62,71 ****
--- 86,106 ----
_is_anonymous = ik->is_anonymous();
_nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields:
_has_injected_fields = -1;
_implementor = NULL; // we will fill these lazily
+ oop holder = ik->klass_holder();
+ ensure_metadata_alive(holder);
+ if (ik->is_anonymous()) {
+ // Though ciInstanceKlass records class loader oop, it's not enough to keep
+ // VM anonymous classes alive (loader == NULL). Klass holder should be used instead.
+ // It is enough to record a ciObject, since cached elements are never removed
+ // during ciObjectFactory lifetime. ciObjectFactory itself is created for
+ // every compilation and lives for the whole duration of the compilation.
+ ciObject* h = CURRENT_ENV->get_object(holder);
+ }
+
Thread *thread = Thread::current();
if (ciObjectFactory::is_initialized()) {
_loader = JNIHandles::make_local(thread, ik->class_loader());
_protection_domain = JNIHandles::make_local(thread,
ik->protection_domain());
< prev index next >