Mercurial > hg > truffle
diff src/share/vm/gc_interface/collectedHeap.cpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | 9a9bb0010c91 |
children | aed758eda82a |
line wrap: on
line diff
--- a/src/share/vm/gc_interface/collectedHeap.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/gc_interface/collectedHeap.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -114,6 +114,38 @@ } } +// This interface assumes that it's being called by the +// vm thread. It collects the heap assuming that the +// heap lock is already held and that we are executing in +// the context of the vm thread. +void CollectedHeap::collect_as_vm_thread(GCCause::Cause cause) { + assert(Thread::current()->is_VM_thread(), "Precondition#1"); + assert(Heap_lock->is_locked(), "Precondition#2"); + GCCauseSetter gcs(this, cause); + switch (cause) { + case GCCause::_heap_inspection: + case GCCause::_heap_dump: + case GCCause::_metadata_GC_threshold : { + HandleMark hm; + do_full_collection(false); // don't clear all soft refs + break; + } + case GCCause::_last_ditch_collection: { + HandleMark hm; + do_full_collection(true); // do clear all soft refs + break; + } + default: + ShouldNotReachHere(); // Unexpected use of this function + } +} +MetaWord* CollectedHeap::satisfy_failed_metadata_allocation( + ClassLoaderData* loader_data, + size_t size, Metaspace::MetadataType mdtype) { + return collector_policy()->satisfy_failed_metadata_allocation(loader_data, size, mdtype); +} + + void CollectedHeap::pre_initialize() { // Used for ReduceInitialCardMarks (when COMPILER2 is used); // otherwise remains unused. @@ -215,9 +247,7 @@ assert(is_in(old_obj), "Not in allocated heap"); assert(!can_elide_initializing_store_barrier(old_obj), "Else should have been filtered in new_store_pre_barrier()"); - assert(!is_in_permanent(old_obj), "Sanity: not expected"); assert(old_obj->is_oop(true), "Not an oop"); - assert(old_obj->is_parsable(), "Will not be concurrently parsable"); assert(deferred.word_size() == (size_t)(old_obj->size()), "Mismatch: multiple objects?"); } @@ -470,15 +500,11 @@ assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); HeapWord* obj; - if (JavaObjectsInPerm) { - obj = common_permanent_mem_allocate_init(size, CHECK_NULL); - } else { assert(ScavengeRootsInCode > 0, "must be"); obj = common_mem_allocate_init(size, CHECK_NULL); - } post_allocation_setup_common(klass, obj); assert(Universe::is_bootstrapping() || - !((oop)obj)->blueprint()->oop_is_array(), "must not be an array"); + !((oop)obj)->is_array(), "must not be an array"); NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); oop mirror = (oop)obj;